使用变更应用服务应用变更
变更应用服务执行与 Sync Framework 的变更应用方组件相同的操作,但是粒度更小。如果目标提供程序要求比标准变更应用方所提供的更大的灵活性,可以使用变更应用服务来只执行提供程序所需的一组操作。例如,提供程序可以执行它自己的冲突检测,并且使用变更应用服务来计算更新的知识。或者,目标提供程序可以使用变更应用服务通过与源提供程序的发送顺序不同的顺序来应用变更。
请注意,报告约束冲突或使用自定义筛选器的提供程序无法使用变更应用服务,否则可能出现意外结果。
处理变更
为了处理变更,目标提供程序执行以下步骤:
创建和初始化变更应用方服务。
开始变更应用会话。
使用变更应用服务执行冲突检测,并且将变更应用用于提供程序尚未处理的变更。
报告未能应用的任何变更。
可以选择报告已成功应用的变更。只有在提供程序在变更应用会话期间检索更新的目标知识时,才需要报告已成功应用的变更。否则,只报告失败的变更并在变更应用会话结束后检索更新的目标知识一次的效率更高。
结束变更应用会话。变更应用服务为处理的变更批返回更新的目标知识。
创建变更应用服务应用对象
目标提供程序创建并初始化 ChangeApplicationServices 对象(对于托管代码)或 IChangeApplicationServices 对象(对于非托管代码)。这是通过调用 ChangeApplicationServices(对于托管代码)实现的,或者通过将 IID_IChangeApplicationServices 传递到 IProviderSyncServices::CreateChangeApplier 然后调用 IChangeApplicationServices::Initialize(对于非托管代码)实现的。
开始变更应用会话
目标提供程序通过调用 BeginChangeApplication(对于托管代码)或 IChangeApplicationServices::BeginChangeApplication(对于非托管代码)开始变更应用会话。传递到此方法的目标知识用作在变更应用期间和之后计算更新的目标知识的基础。
处理变更
目标提供程序使用变更应用服务来只处理那些尚未处理的变更。例如,目标提供程序执行它自己的冲突检测并应用变更本身。在这种情况下,变更应用服务不用于处理变更。或者,目标提供程序通过与源提供程序的发送顺序不同的顺序来应用变更。在这种情况下,变更应用服务用于通过以目标提供程序指定的顺序处理变更。
为了处理变更,目标提供程序执行以下步骤:
调用 GetChangeApplicationContext(对于托管代码)或 IChangeApplicationServices::GetChangeApplicationContext(对于非托管代码)以便开始处理变更。此方法返回 ChangeApplicationContext 对象(对于托管代码)或 IChangeApplicationContext 对象(对于非托管代码)。
获取 ChangeApplicationAction 属性(对于托管代码)或者调用 IChangeApplicationContext::GetChangeApplicationAction(对于非托管代码)。此方法将要执行的下一个操作返回为 ChangeApplicationAction 值(对于托管代码)或 IChangeApplicationContext 接口 值(对于非托管代码)。
采取指定的操作,例如将变更保存到目标副本。有关处理可能的操作的更多信息,请参见有关变更应用服务组件的参考主题。
重复执行这些步骤,直到在步骤 1 中返回的操作是 Finished(对于托管代码)或 CAA_FINISHED(对于非托管代码)。
报告成功和失败的变更
如果目标提供程序使用变更应用服务来计算更新的知识,则提供程序必须在结束变更应用会话前报告未能应用的所有变更。若要报告失败的变更,请调用 ReportRecoverableErrorOnItemChange 或 ReportRecoverableErrorOnChangeUnitChange(对于托管代码)或者 IChangeApplicationServices::ReportRecoverableErrorOnItemChange 或 IChangeApplicationServices::ReportRecoverableErrorOnChangeUnitChange(对于非托管代码)。
此外,如果目标提供程序在变更应用会话期间检索更新的目标知识,则该提供程序必须报告已成功应用的变更。通过调用 GetUpdatedDestinationKnowledge(对于托管代码)或 IChangeApplicationServices::GetUpdatedDestinationKnowledge(对于非托管代码)检索更新的目标知识。只有在变更应用会话结束后提供程序检索更新的知识时,报告成功的变更才不是必需的。若要报告成功应用的变更,请调用 ReportItemChangeApplied 或 ReportChangeUnitChangeApplied(对于托管代码)或者 IChangeApplicationServices::ReportItemChangeApplied 或 IChangeApplicationServices::ReportChangeUnitChangeApplied(对于非托管代码)。
结束变更应用会话
在处理了所有的变更后,目标提供程序通过调用 EndChangeApplication(对于托管代码)或 IChangeApplicationServices::EndChangeApplication(对于非托管代码)结束变更应用会话。在源提供程序的变更批中包含的已知知识将传递到此方法中。变更应用服务根据已知知识和已报告为失败的变更计算已更新目标知识。从该方法返回的已更新目标知识必须替换目标副本的当前知识。