共用方式為


同步處理變更單位

變更單位代表子項目變更,例如代表連絡人卡片之項目中的電話號碼欄位。提供者可以透過使用變更單位,更有效率地同步處理子項目變更。可能利用變更單位的一些範例包括:個人資訊管理員 (PIM) 提供者,以及處理含中繼資料影像的提供者。

變更單位

變更單位可以代表精簡子項目變更,並允許更細緻的變更追蹤。這可以減少進行項目變更時所引發的衝突數量。

請考慮代表保存在檔案系統上之連絡人卡片的項目。如果變更追蹤的資料粒度是在項目 (檔案) 層級,對檔案進行任何變更都是項目變更,而必須傳輸連絡人中的所有資料。如果使用變更單位,提供者可以決定改為在連絡人的屬性 (例如「名字」、「姓氏」和「電話號碼」) 層級上偵測變更。在此情況下,如果兩個複寫分別在連絡人上變更不同的屬性,例如當一個人修改電子郵件地址時,而另一個人加上影像,就不會在項目層級上偵測到衝突,而只要傳送變更單位資料即可。

變更單位集有效率地形成結構描述,在其中變更單位的順序是由同步處理特定結構描述的複寫來決定。例如,複寫可以決定將連絡人屬性表示如下:

Change Unit[0] = First Name

Change Unit[1] = Last Name

Change Unit[2] = Phone Number

刪除變更單位

變更單位的期間是受限於項目的持續期間。變更單位與一般變更項目不同,由於複寫已同意這些都是項目的屬性,所以無法刪除變更單位。

加入變更單位

提供者不應該臨時起意嘗試要建立變更單位,因為可能會發生您不想要的效果。

變更單位可以根據與資料同步處理發生 Out-of-Band 的結構描述更新來加入。若要讓這項作業順利運作,加入的變更單位必須有 null 值,或所有複寫都採用的預設值。然後,加入的變更單位之更新版本就會成為項目的建立版本,直到變更單位進行修改為止。以這種方式處理外加變更單位,對應用程式元件來說,它們就跟一開始就有而未經修改的變更單位完全一樣。

列舉變更單位變更

當來源提供者使用變更單位來代表從來源複寫列舉的子項目時,只會傳送已變更的變更單位,而不是傳送整個項目。請注意,當項目包含變更單位時,只為每個變更單位而不是為項目本身保存版本資訊。

使用 Managed 程式碼列舉變更單位變更

若要決定所要傳送的變更單位,來源提供者會使用目的地提供者之 SyncKnowledge 物件的 ContainsContains 方法。如果目的地知識中不包含變更單位,變更必須包含於來源提供者所傳送的變更批次中。

變更單位變更包含於加入變更批次中的項目變更之內。您可以使用 ItemChange 建構函式,建立 ItemChange 物件來包含變更單位變更,或者使用 AddChangeUnitChange 加入變更單位變更。

使用 Unmanaged 程式碼列舉變更單位變更

若要決定所要傳送的變更單位,來源提供者會使用目的地提供者之 ISyncKnowledge 物件的 ISyncKnowledge::ContainsChangeUnit 方法。如果變更單位不包含於目的地知識中,則必須包含於來源提供者所傳送的變更批次中。

變更單位變更包含於加入變更批次中的項目變更之內。若要加入變更單位變更,請指定 ISyncChangeBatchBase::AddItemMetadataToGroup 方法之 ppChangeBuilder 參數的非 NULL 值。然後可以使用傳回的 ISyncChangeBuilder 物件,使用 ISyncChangeBuilder::AddChangeUnitMetadata,將變更單位變更加入相關聯的項目變更。

處理變更單位變更

當目的地提供者使用變更套用者,在其 ProcessChangeBatch (適用於 Managed 程式碼) 或 IKnowledgeSyncProvider::ProcessChangeBatch (適用於 Unmanaged 程式碼) 方法中協助處理變更批次,目的地提供者會為從來源提供者接到的每個變更列舉目的地版本資訊。當來源變更包含變更單位變更時,目的地提供者必須判斷哪些變更單位版本 (如果有的話) 要包含在目的地版本批次中。這項決定會取決於來源提供者的變更類型,以及項目是否在目的地複寫上標示為已刪除。下表顯示目的地提供者必須傳送哪個版本資訊給變更套用者。

 

來源變更為刪除。

來源變更為更新。

目的地項目為刪除。

僅限目的地項目版本。只允許在整個項目上刪除。因此,會為項目追蹤刪除的版本資訊。

僅限目的地項目版本。只允許在整個項目上刪除。因此,會為項目追蹤刪除的版本資訊。

目的地項目不是刪除。

所有目的地變更單位版本。

目的地只會變更從來源所列舉變更單位的變更版本。

處理包含變更單位的衝突

當應用程式使用包含變更單位之變更的自訂衝突解決時,一般來說,它必須使用 SetResolutionAction (適用於 Managed 程式碼) 或 IChangeConflict::SetResolveActionForChangeUnit (適用於 Unmanaged 程式碼),為變更單位衝突設定衝突解決動作。

但如果是因為在一個複寫上更新而在另一個複寫上刪除而產生衝突時,應用程式就必須使用 SetResolutionAction (適用於 Managed 程式碼) 或 IChangeConflict::SetResolveActionForChange (適用於 Unmanaged 程式碼),為項目衝突指定衝突解決動作。

套用變更單位變更

一般來說,當變更包含變更單位時,Sync Framework 會呼叫 SaveChangeWithChangeUnits (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits (適用於 Unmanaged 程式碼),將變更套用至目的地複寫。但是所發生衝突已經解決並將該項目刪除時,Sync Framework 會呼叫 SaveItemChange (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveChange (適用於 Unmanaged 程式碼)。這是因為只有整個項目才能刪除,而無法刪除各個變更單位。

請參閱

概念

實作標準的自訂提供者