同步变更单位

变更单位表示子项变更,如表示联系人卡片的项中的电话号码字段。通过使用变更单位,提供程序可以更高效地同步子项变更。可以利用变更单位的一些提供程序示例包括个人信息管理器 (PIM) 提供程序以及处理图像及其元数据的提供程序。

变更单位

通过变更单位,可以表示小型的子项变更,并允许进行更细致的变更跟踪。这可以减少当对项进行变更时引发的冲突数。

请看一个表示文件系统上保留的联系人卡片的项。如果变更跟踪的粒度为项(文件)级别,则对此文件所做的任何变更都将是项变更,此时必须传输该联系人的所有数据。通过使用变更单位,提供程序可以转而决定在联系人的属性级别(例如,名字、姓氏和电话号码)检测变更并解决数据冲突。在此情况下,如果两个副本独立地更改有关联系人的不同属性(例如,一个副本修改电子邮件地址,而另一个副本附加图像),则不会在项级别检测到冲突,而仅须发送变更单位数据。

变更单位集有效地形成一个架构,其中,变更单位的顺序由正在同步某特定架构的副本决定。例如,副本可以决定按以下所示表示联系人属性:

Change Unit[0] = First Name

Change Unit[1] = Last Name

Change Unit[2] = Phone Number

删除变更单位

变更单位的持续时间绑定到项的持续时间。与常规的变更项不同,您不能删除变更单位,因为副本已同意这些是项的属性。

添加变更单位

提供程序不应尝试自发创建变更单位,因为这可能带来有害效果。

可以根据在数据同步过程中以带外方式发生的架构更新来添加变更单位。为此,所添加的变更单位必须具有 null 值或所有副本都采用的默认值。然后,所添加的变更单位的更新版本将成为项的创建版本,直到修改这些变更单位为止。通过以这种方式处理变更单位添加,所添加的变更单位就成为应用程序组件,它们与从最初就存在且从未进行过修改的变更单位没有什么两样。

枚举变更单位变更

当源提供程序使用变更单位表示从源副本枚举的子项时,它仅发送已变更的变更单位而非整个项。请注意,当项包含变更单位时,仅为每个变更单位(而不为项本身)保留版本信息。

使用托管代码枚举变更单位变更

为了确定要发送哪些变更单位,源提供程序使用目标提供程序中 SyncKnowledge 对象的 ContainsContains 方法。如果目标知识中未包含变更单位变更,则由源提供程序发送的变更批中必须包含此变更。

变更单位变更包含在添加到变更批的项变更中。可以通过使用 ItemChange 构造函数创建 ItemChange 对象以包含变更单位变更,也可以通过使用 AddChangeUnitChange 添加变更单位变更。

使用非托管代码枚举变更单位变更

为了确定要发送哪些变更单位,源提供程序使用目标提供程序中 ISyncKnowledge 对象的 ISyncKnowledge::ContainsChangeUnit 方法。如果目标知识中未包含变更单位变更,则由源提供程序发送的变更批中必须包含此变更。

变更单位变更包含在添加到变更批的项变更中。为了添加变更单位变更,请为 ISyncChangeBatchBase::AddItemMetadataToGroup 方法的 ppChangeBuilder 参数指定非 NULL 值。然后,可以使用返回的 ISyncChangeBuilder 对象,通过使用 ISyncChangeBuilder::AddChangeUnitMetadata 将变更单位变更添加到关联的项变更。

处理变更单位变更

当目标提供程序使用变更应用方在其 ProcessChangeBatch(对于托管代码)或 IKnowledgeSyncProvider::ProcessChangeBatch(对于非托管代码)方法中帮助处理变更批时,目标提供程序将针对从源提供程序收到的每个变更枚举目标版本信息。如果源变更包含变更单位变更,则目标提供程序必须确定哪些变更单位版本(如果有)包含在目标版本批中。此决定取决于来自源提供程序的变更的类型以及项在目标副本中是否标记为已删除。下表显示目标提供程序必须将哪些版本信息发送到变更应用方。

 

源变更是一个删除操作

源变更是一个更新操作

删除目标项

仅限目标项版本。只允许对整个项执行删除操作。因此,将针对项跟踪某个删除操作的版本信息。

仅限目标项版本。只允许对整个项执行删除操作。因此,将针对项跟踪某个删除操作的版本信息。

不删除目标项

所有目标变更单位版本。

仅适用于从源枚举的变更单位的目标变更单位版本。

处理包含变更单位的冲突

当应用程序对于包含变更单位的变更使用自定义冲突解决时,通常它必须通过使用 SetResolutionAction(对于托管代码)或 IChangeConflict::SetResolveActionForChangeUnit(对于非托管代码)为变更单位冲突设置冲突解决操作。

然而,当由于对一个副本执行更新和对另一个副本执行删除而导致冲突时,应用程序必须通过使用 SetResolutionAction(对于托管代码)或 IChangeConflict::SetResolveActionForChange(对于非托管代码)为项冲突指定冲突解决操作。

应用变更单位变更

通常,当变更包含变更单位时,Sync Framework 调用 SaveChangeWithChangeUnits(对于托管代码)或 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits(对于非托管代码)以将变更应用于目标副本。然而,当冲突已发生且已被解决以便删除此项时,Sync Framework 将调用 SaveItemChange(对于托管代码)或 ISynchronousNotifyingChangeApplierTarget::SaveChange(对于非托管代码)。这是因为只能删除整个项,而不能删除单独的变更单位。

请参阅

概念

实现标准自定义提供程序