使用變更套用服務來套用變更
變更套用服務所執行的動作與 Sync Framework 的變更套用者元件相同,但是其執行的方式會更精細。需要比標準變更套用者提供更大彈性的目的地提供者可以使用變更套用服務,以便只執行提供者所需的動作集合。例如,提供者可以進行自己的衝突偵測,並且使用變更套用服務來計算更新的知識。或者,目的地提供者可以使用變更套用服務,以有別於來源提供者所傳送的順序套用變更。
請留意,報告條件約束衝突或使用自訂篩選的提供者不可使用變更套用服務,否則可能會發生無法預期的結果。
處理變更
若要處理變更,目的地提供者會執行下列步驟:
建立並初始化變更套用者服務。
啟動變更套用工作階段。
使用變更套用服務,針對提供者沒有以其他方式處理的變更執行衝突偵測和變更套用。
報告無法套用的任何變更。
選擇性地報告成功套用的變更。只有當提供者在變更套用工作階段期間擷取更新的目的地知識時,才需要這份報告。否則,在變更套用工作階段結束之後僅報告失敗的變更以及擷取一次更新的目的地知識會比較有效率。
結束變更套用工作階段。變更套用服務會針對所處理的變更批次傳回更新的目的地知識。
建立變更套用服務物件
目的地提供者會建立並初始化 ChangeApplicationServices 物件 (適用於 Managed 程式碼) 或 IChangeApplicationServices 物件 (適用於 Unmanaged 程式碼)。這項作業是透過呼叫 ChangeApplicationServices (適用於 Managed 程式碼) 或傳遞 IID_IChangeApplicationServices 給 IProviderSyncServices::CreateChangeApplier,然後呼叫 IChangeApplicationServices::Initialize (適用於 Unmanaged 程式碼) 完成的。
啟動變更套用工作階段
目的地提供者會透過呼叫 BeginChangeApplication (適用於 Managed 程式碼) 或 IChangeApplicationServices::BeginChangeApplication (適用於 Unmanaged 程式碼),啟動變更套用工作階段。傳遞給這個方法的目的地知識會當做基礎使用,以便在變更套用期間和之後計算更新的目的地知識。
處理變更
目的地提供者會使用變更套用服務來單獨處理沒有以其他方式處理的變更。例如,目的地提供者會執行自己的衝突偵測並且自行套用變更。在此情況下,變更套用服務不會用來處理變更。或者,目的地提供者會以有別於來源提供者所傳送的順序套用變更。在此情況下,變更套用服務就會用來按照目的地提供者所指定的順序處理變更。
若要處理變更,目的地提供者會執行下列步驟:
呼叫 GetChangeApplicationContext (適用於 Managed 程式碼) 或 IChangeApplicationServices::GetChangeApplicationContext (適用於 Unmanaged 程式碼) 來開始處理變更。這個方法會傳回 ChangeApplicationContext 物件 (適用於 Managed 程式碼) 或 IChangeApplicationContext 物件 (適用於 Unmanaged 程式碼)。
取得 ChangeApplicationAction 屬性 (適用於 Managed 程式碼) 或呼叫 IChangeApplicationContext::GetChangeApplicationAction (適用於 Unmanaged 程式碼)。這個方法會傳回下一個要採取的動作成為 ChangeApplicationAction 值 (適用於 Managed 程式碼) 或 IChangeApplicationContext 介面 值 (適用於 Unmanaged 程式碼)。
採取指定的動作,例如將變更儲存至目的地複寫。如需處理可能動作的詳細資訊,請參閱變更套用服務元件的參考主題。
重複這些步驟,直到步驟 1 所傳回的動作是 Finished (適用於 Managed 程式碼) 或 CAA_FINISHED (適用於 Unmanaged 程式碼) 為止。
報告成功和失敗的變更
如果目的地提供者使用變更套用服務來計算更新的知識,此提供者就必須在結束變更套用工作階段之前報告無法套用的任何變更。若要報告失敗的變更,請呼叫 ReportRecoverableErrorOnItemChange 或 ReportRecoverableErrorOnChangeUnitChange (適用於 Managed 程式碼) 或是 IChangeApplicationServices::ReportRecoverableErrorOnItemChange 或 IChangeApplicationServices::ReportRecoverableErrorOnChangeUnitChange (適用於 Unmanaged 程式碼)。
此外,如果目的地提供者在變更套用工作階段期間擷取更新的目的地知識,此提供者就必須報告成功套用的變更。更新的目的地知識是透過呼叫 GetUpdatedDestinationKnowledge (適用於 Managed 程式碼) 或 IChangeApplicationServices::GetUpdatedDestinationKnowledge (適用於 Unmanaged 程式碼) 來擷取。當提供者只有在變更套用工作階段結束之後才擷取更新的知識時,就不需要報告成功的變更。若要報告成功套用的變更,請呼叫 ReportItemChangeApplied 或 ReportChangeUnitChangeApplied (適用於 Managed 程式碼) 或是 IChangeApplicationServices::ReportItemChangeApplied 或 IChangeApplicationServices::ReportChangeUnitChangeApplied (適用於 Unmanaged 程式碼)。
結束變更套用工作階段
當所有變更都已經處理完成時,目的地提供者會透過呼叫 EndChangeApplication (適用於 Managed 程式碼) 或 IChangeApplicationServices::EndChangeApplication (適用於 Unmanaged 程式碼),結束變更套用工作階段。此時,包含在來源提供者之變更批次中的學習到的知識會傳遞給這個方法。變更套用服務會根據學習到的知識以及報告成失敗的變更,計算更新的目的地知識。這個方法所傳回的更新目的地知識必須取代目的地複寫目前的知識。