枚举变更

源提供程序响应 GetChangeBatch(对于托管代码)或 IKnowledgeSyncProvider::GetChangeBatch(对于非托管代码)请求时,它的任务是生成不为目标副本所知的一批变更。源提供程序确定源副本中的哪些项不包括在目标提供程序发送的知识对象中,然后返回一批这样的项。

每个变更批由以下信息组成:

  • 已变更的项的全局 ID 和版本。

  • 目标副本应了解的逻辑删除信息。

  • 生成知识。这是执行变更的源副本的知识。当目标提供程序应用变更时,Sync Framework 从生成知识计算目标的已知知识。

  • 必备知识。它是处理此批变更时目标副本必须具有的最少知识。如果目标副本的知识不包含必备知识,将无法处理这些变更。

  • 源副本的遗忘知识。它用于检测过时的目标副本。

枚举两个副本间的变更

本节描述这样的情形,该情形通过使用 Sync Framework 知识接口介绍枚举两个副本间的变更的过程。

备注

   一个副本负责确保在提供程序枚举变更前使在本地执行的变更反映在自己的知识中。这可以通过在执行本地变更时更新知识或在枚举变更前传递元数据维护信息来实现。

在此情形中,目标提供程序从源提供程序请求变更。请求顺序如下所示:

  1. 目标副本确保对于要与源副本同步的作用域,在本地执行的所有变更均反映在自己的知识中。

  2. 目标提供程序将目标副本的知识发送给源提供程序。源提供程序通过 GetChangeBatch(对于托管代码)或 IKnowledgeSyncProvider::GetChangeBatch(对于非托管代码)方法接收知识。

  3. 为了生成变更批,源提供程序枚举源副本中执行的变更和删除并对照目标副本的知识逐一验证。仅将目标副本的知识中未包含的变更添加到变更批。变更批由 ChangeBatch 对象(对于托管代码)或 ISyncChangeBatch 接口(对于非托管代码)表示。

  4. 源提供程序将变更批返回给目标提供程序。

备注

   变更集中可能包含很多变更。为了确保有足够时间处理传入的变更列表,目标提供程序可以通过在 GetSyncBatchParameters(对于托管代码)或 GetSyncBatchParameters(对于非托管代码)方法中返回非零的批大小,请求按批发送变更。

源提供程序使用变更单位表示枚举的源副本中的子项时,仅发送已发生变更的变更单位而非整个项。有关更多信息,请参见同步变更单位

处理过时的变更

构造变更批时,自动排除过时的变更。过时的变更是指已包含在目标副本的知识中、不应应用到目标副本的变更。将变更添加到变更批时,Sync Framework 将变更版本与目标副本的知识进行比较,仅当该变更未包含在目标副本的知识中时才添加它。这将生成最小的变更批并使提供程序实现更简单的枚举变更算法,如基于滴答计数的算法。

提供程序可以执行自己的验证来确保添加到变更批的变更不过时。为此,提供程序确定变更的全局 ID 和版本是否包含在目标副本的知识中。通过使用 Contains(对于托管代码)或 ISyncKnowledge::ContainsChange(对于非托管代码)方法做到这点。如果知识中不包含该变更,则提供程序将该变更添加到变更批。这将生成最小的变更批,对于要完全控制变更批构造的提供程序很有用。

筛选变更枚举

可以通过各种方法(例如,使用项筛选器、变更单位筛选器或自定义筛选器)来筛选源提供程序枚举的变更。此外,当在同步社区中使用筛选器时,副本可以跟踪自定义筛选器以提高效率,这意味着在变更枚举期间必须发送其他信息。有关更多信息,请参见筛选同步数据

请参阅

参考

ISyncKnowledge 接口
ISyncChangeBatch 接口
IKnowledgeSyncProvider 接口
IKnowledgeSyncProvider::GetChangeBatch
SyncKnowledge
ChangeBatch
KnowledgeSyncProvider
GetChangeBatch

概念

实现标准自定义提供程序
处理冲突
了解同步知识