変更適用サービスの使用による変更の適用

変更適用サービスは、Sync Framework の変更適用元コンポーネントと同じアクションをより詳細なレベルで実行します。同期先プロバイダーで標準の変更適用元が提供するものよりも柔軟な手段が必要な場合は、変更適用サービスを使用して、必要なアクションだけを実行できます。たとえば、プロバイダーでは、競合の検出を独自に行って変更適用サービスを使用し、更新されたナレッジを計算できます。または、同期先プロバイダーは変更適用サービスを使用して、同期元プロバイダーが送信した変更を別の順序で適用できます。

制約の競合を報告したりカスタム フィルターを利用したりするプロバイダーでは変更適用サービスを使用できないことに注意してください。このようなプロバイダーで変更適用サービスを使用すると、予期しない結果が生じる可能性があります。

変更の処理

変更を処理するため、同期先プロバイダーは、次の手順を実行します。

  1. 変更適用サービスを作成して初期化します。

  2. 変更適用セッションを開始します。

  3. 変更適用サービスを使用して、競合を検出し、プロバイダーが他の形では処理しない変更を適用します。

  4. 適用できなかった変更があれば報告します。

  5. オプションとして、正常に適用された変更を報告します。これが必要になるのは、変更適用セッション時に更新された同期先ナレッジをプロバイダーが取得するときだけです。それ以外の場合は、適用できなかった変更だけを報告し、変更適用セッション終了後に、更新された同期先ナレッジを一度だけ取得するようにする方が効率的です。

  6. 変更適用セッションを終了します。変更適用サービスは、処理された変更バッチの更新された同期先ナレッジを返します。

変更適用サービス オブジェクトの作成

同期先プロバイダーは、ChangeApplicationServices オブジェクト (マネージ コードの場合) または IChangeApplicationServices オブジェクト (アンマネージ コードの場合) を作成して、初期化します。これは、ChangeApplicationServices を呼び出すか (マネージ コードの場合)、または IID_IChangeApplicationServicesIProviderSyncServices::CreateChangeApplier に渡してから IChangeApplicationServices::Initialize を呼び出す (アンマネージ コードの場合) ことによって行われます。

変更適用セッションの開始

同期先プロバイダーは、BeginChangeApplication (マネージ コードの場合) または IChangeApplicationServices::BeginChangeApplication (アンマネージ コードの場合) を呼び出して、変更適用セッションを開始します。このメソッドに渡される同期先ナレッジは、変更適用中とその後に更新された同期先ナレッジを計算するための土台として使用されます。

変更の処理

同期先プロバイダーは、変更適用サービスを使用して、それ以外の方法では処理されない変更だけを処理します。たとえば、同期先プロバイダーは、競合の検出を独自に実行して、変更を適用します。この場合、変更の処理に変更適用サービスは使用されません。または、同期先プロバイダーは、同期元プロバイダーからの送信順とは異なる順序で変更を適用します。この場合には、同期先プロバイダーが指定した順序で変更を処理するために、変更適用サービスが使用されます。

変更を処理するために、同期先プロバイダーは、次の手順を実行します。

  1. GetChangeApplicationContext (マネージ コードの場合) または IChangeApplicationServices::GetChangeApplicationContext (アンマネージ コードの場合) を呼び出して、変更の処理を開始します。このメソッドは、ChangeApplicationContext オブジェクト (マネージ コードの場合) または IChangeApplicationContext オブジェクト (アンマネージ コードの場合) を返します。

  2. ChangeApplicationAction プロパティを取得する (マネージ コードの場合) か、IChangeApplicationContext::GetChangeApplicationAction を呼び出します (アンマネージ コードの場合)。このメソッドは、実行する必要がある次のアクションを ChangeApplicationAction 値 (マネージ コードの場合) または IChangeApplicationContext インターフェイス 値 (アンマネージ コードの場合) として返します。

  3. 変更を同期先レプリカに保存するなど、指定されたアクションを実行します。実行可能なアクションの処理の詳細については、変更適用サービス コンポーネントに関する参照トピックを参照してください。

  4. 手順 1. で返されたアクションが、Finished (マネージ コードの場合) または CAA_FINISHED (アンマネージ コードの場合) になるまで、これまでの手順を繰り返します。

成功および失敗した変更の報告

同期先プロバイダーは、変更適用サービスを使用して更新されたナレッジを計算する場合、変更適用セッションを終了する前に、適用できなかった変更があれば報告する必要があります。適用できなかった変更を報告するには、ReportRecoverableErrorOnItemChange または ReportRecoverableErrorOnChangeUnitChange (マネージ コードの場合) を呼び出すか、IChangeApplicationServices::ReportRecoverableErrorOnItemChange または IChangeApplicationServices::ReportRecoverableErrorOnChangeUnitChange (アンマネージ コードの場合) を呼び出します。

また、同期先プロバイダーは、更新された同期先ナレッジを変更適用セッション中に取得する場合、正常に適用できた変更を報告する必要があります。更新された同期先ナレッジは、GetUpdatedDestinationKnowledge (マネージ コードの場合) または IChangeApplicationServices::GetUpdatedDestinationKnowledge (アンマネージ コードの場合) を呼び出すことによって取得されます。更新されたナレッジを変更適用セッションの終了後のみにプロバイダーが取得する場合には、正常に適用できた変更の報告は必要ありません。正常に適用できた変更を報告するには、ReportItemChangeApplied または ReportChangeUnitChangeApplied (マネージ コードの場合) を呼び出すか、IChangeApplicationServices::ReportItemChangeApplied または IChangeApplicationServices::ReportChangeUnitChangeApplied (アンマネージ コードの場合) を呼び出します。

変更適用セッションの終了

変更の処理がすべて完了したら、同期先プロバイダーは、EndChangeApplication (マネージ コードの場合) または IChangeApplicationServices::EndChangeApplication (アンマネージ コードの場合) を呼び出して、変更適用セッションを終了します。同期元プロバイダーの変更バッチに含まれる学習されたナレッジは、このメソッドに渡されます変更適用サービスは、学習したナレッジおよび適用できなかったと報告された変更から、更新された同期先ナレッジを計算します。このメソッドから返された更新された同期先ナレッジで、同期先レプリカの現在のナレッジを置き換える必要があります。

参照

概念

変更の適用