与提供程序进行互操作
元数据存储服务提供了若干方法,可帮助对同步提供程序的实现进行简化。这些方法有助于执行以下任务:
帮助源提供程序枚举变更。
帮助源提供程序在枚举变更期间筛选变更。
帮助目标提供程序为变更应用方获取项的目标版本。
帮助提供程序或应用程序清除在元数据存储区中标记为已删除的项。
帮助目标提供程序恢复过期目标副本。
枚举变更
副本元数据对象包含一种方法,该方法可以在提供程序充当源提供程序时枚举变更。对于多数情况,该提供程序的 GetChangeBatch 方法都可以通过直接向副本元数据对象实现传递方法参数来实现。
托管代码:若要枚举对源副本所做的变更,请调用 ReplicaMetadata 对象的 GetChangeBatch 方法。
非托管代码:若要枚举对源副本所做的变更,请调用 IReplicaMetadata::GetChangeBatch 方法。
筛选变更
使用回调可以处理经筛选的同步。在将项添加到变更批之前调用回调方法。这样回调处理程序即有机会检查每一项,并且指示是否应将该项包括在批中。
托管代码:若要筛选包括在变更批中的变更,请实现一个 ItemFilterCallback 委托,并将其传递给 GetFilteredChangeBatch。
非托管代码:若要筛选包括在变更批中的变更,请实现 IChangeBatchCallback,并将其传递给 IReplicaMetadata::GetFilteredChangeBatch。
获取目标版本
副本元数据对象提供了一种方法,该方法可帮助目标提供程序实现其 ProcessChangeBatch 方法,采用的方式是从源提供程序获取包含在变更批中的项的目标副本的版本。随后可以将这一目标版本批传递给变更应用方。
托管代码:若要获取包含适用于目标副本的版本的变更批,请调用 ReplicaMetadata 对象的 GetLocalVersions 方法。
非托管代码:若要获取包含适用于目标副本的版本的变更批,请调用 IReplicaMetadata::GetItemBatchVersions 方法。
清除已删除的项
已从副本中删除的项保留在元数据存储区中,同时有一个值指示已经删除该项。为避免副本上的存储空间不足,必须定期清除这些已删除项的元数据。副本元数据对象提供 CleanupDeletedItems (对于托管代码)或 IReplicaMetadata::CleanupDeletedItems(对于非托管代码)方法,可帮助提供程序定期清除已删除的项。提供程序指定一个时间间隔,用来表示存储在元数据存储区中的已删除项的最短保持期,并且定期(如在每次提供程序执行变更检测时)调用清除方法。为防止提供程序执行占用大量资源的完全枚举,清除方法仅在超过指定时间后才清除已删除项,并且始终保留保持期未超过指定时间间隔的已删除项。清除方法还更新遗忘知识以反映删除的已删除项。
恢复过期副本
当 Sync Framework 检测到目标副本已过期时,Sync Framework 将触发完全枚举以还原目标副本。如果源副本已从元数据中删除已删除项,但是未将删除该项这一信息传达给目标副本,此时目标副本就会过期。若要执行完全枚举,Sync Framework 需要调用源提供程序的 GetFullEnumerationChangeBatch 方法和目标提供程序的 ProcessFullEnumerationChangeBatch 方法。元数据通过服务提供了有助于提供程序实现这些方法的方法。
托管代码:调用源提供程序的 GetFullEnumerationChangeBatch 方法时,源提供程序可以调用 ReplicaMetadata 对象的 GetFullEnumerationChangeBatch 方法。调用目标提供程序的 ProcessFullEnumerationChangeBatch 方法时,目标提供程序可以通过调用 ReplicaMetadata 对象的 GetFullEnumerationLocalVersions 方法获取包含适用于目标副本的版本的变更批。
非托管代码:调用源提供程序的 GetFullEnumerationChangeBatch 方法时,源提供程序可以调用 IReplicaMetadata::GetFullEnumerationChangeBatch。调用目标提供程序的 ProcessFullEnumerationChangeBatch 方法时,目标提供程序可以通过调用 IReplicaMetadata::GetFullEnumerationItemBatchVersions 获取包含适用于目标副本的版本的变更批。
请参阅
参考
IReplicaMetadata 接口
IChangeBatchCallback 接口
ReplicaMetadata
ItemFilterCallback