数据同步基础知识
Microsoft Sync Framework 通过使用三个基本组件来同步数据存储区或“副本”**:一个同步会话和两个同步提供程序。为了同步数据,应用程序创建一个同步会话,并向它传递一个源提供程序和一个目标提供程序。此会话使用源提供程序获取源副本中已发生的新变更,并使用目标提供程序将这些变更应用于目标副本。
创建提供程序占用了大多数的开发工作量。提供程序维护副本的元数据和知识,并为要同步的每个项维护元数据。提供程序还将实际项数据传入和传出其数据存储区。当提供程序充当源时,它将使用 Sync Framework 组件帮助枚举变更;当提供程序充当目标时,它将检测冲突并应用变更。
同步算法
用于单向同步的算法包含以下步骤:
会话获取目标副本的当前知识,并将其发送到源提供程序。
源提供程序枚举目标知识中未包含的变更。
源提供程序将变更发送到会话。
会话检测冲突,并通过目标提供程序将变更应用于目标副本。
两个副本之间的双向同步是通过两个单向同步实现的。
托管代码:当 Direction 属性设置为 DownloadAndUpload 或 UploadAndDownload 时,SyncOrchestrator 对象执行两个单向同步。
非托管代码:应用程序必须为每个单向同步创建 ISyncSession 对象。
元数据管理
每个副本都必须向“同步社区”**提供一组描述其本身及其知识的元数据。(同步社区是可以彼此同步的一组副本。)每个副本所需的元数据为:副本 ID、当前滴答计数、副本键映射、当前知识、遗忘的知识、冲突日志和逻辑删除日志。副本还必须为要同步的每个项维护元数据。每个项所需的元数据为:全局 ID、当前版本和创建版本。通常,同步提供程序管理同步所需的元数据。然而,根据副本的实现,由单独的组件来处理元数据管理的某些部分可能更有用,例如,一项在预定时间(非不是在同步过程中)清除逻辑删除的服务。
有关元数据的更多信息,请参见元数据要求。
同步提供程序
提供程序管理副本的元数据并使用 Sync Framework 来枚举变更和检测冲突。当此提供程序充当源提供程序时,它还使用副本的项存储区来发送项数据;当该提供程序充当目标提供程序时,它将应用变更。
托管代码:提供程序从 KnowledgeSyncProvider、IChangeDataRetriever 和 INotifyingChangeApplierTarget 实现抽象方法和属性。
非托管代码:提供程序实现 IKnowledgeSyncProvider、ISyncProvider、ISynchronousDataRetriever 和 ISynchronousNotifyingChangeApplierTarget 接口(或者,对于异步提供程序,则实现异步版本)。
有关同步提供程序以及如何实现和使用这些接口的更多信息,请参阅同步提供程序。
同步应用程序
此应用程序是一个组件,它创建同步会话对象,将此对象与提供程序相连,并承载同步运行时。
使用托管代码实现同步应用程序
若要开始同步,请创建 SyncOrchestrator 对象。然后,将 LocalProvider 和 RemoteProvider 属性设置为要同步的两个提供程序的 SyncProvider 接口。应用程序使用最适合的方法获取或创建提供程序接口。在创建 SyncOrchestrator 对象后,调用 Synchronize 以开始同步。此时,Sync Framework 对两个提供程序进行所有必要的调用以执行同步。
在同步过程中,SyncOrchestrator 对象和 KnowledgeSyncProvider 对象都将引发事件。若要接收事件,请实现一个事件处理程序方法,并进行注册以接收此事件。
使用非托管代码实现同步应用程序
若要开始同步,请通过将 CLSID_SyncServices 和 IID_IApplicationSyncServices 传递到 CoCreateInstance 函数以创建 ISyncSession 对象,然后对于返回的 IApplicationSyncServices 对象调用 IApplicationSyncServices::CreateSyncSession。
CreateSyncSession 方法要求要同步的两个提供程序的 ISyncProvider 接口。应用程序使用最适合的方法获取或创建提供程序接口。在创建 ISyncSession 对象后,调用 ISyncSession::Start 以开始同步。此时,Sync Framework 对两个提供程序进行所有必要的调用以执行同步。
在同步过程中,ISyncSession 对象将引发事件。若要接收事件,请实现 ISyncCallback 接口并通过使用 ISyncSession::RegisterCallback 注册此接口。
请参阅
参考
ISyncSession 接口
ISyncProvider 接口
IKnowledgeSyncProvider 接口
ISynchronousDataRetriever 接口
ISynchronousNotifyingChangeApplierTarget 接口
IApplicationSyncServices 接口
IProviderSyncServices 接口
ISyncCallback 接口
SyncOrchestrator
KnowledgeSyncProvider
IChangeDataRetriever
INotifyingChangeApplierTarget
SyncCallbacks