フィルター ネゴシエーションの方法
このトピックでは、マネージ言語を使って同期に使用するフィルターのネゴシエーションを行う方法を説明します。2 つのプロバイダー間でのネゴシエーションは Sync Framework が仲介します。
このトピックは、C# および Microsoft .NET Framework の概念について基本的な知識がある方を対象としています。
このトピックの例では、次に示す Sync Framework のインターフェイスとメンバーを中心に説明します。
フィルター ネゴシエーションについて
変更の列挙時に同期元プロバイダーによって使用されるフィルターは、同期先プロバイダーが同期元プロバイダーに対して指定することができます。同期元プロバイダーは、同期先プロバイダーから要求されたフィルターを受け入れることも、拒否することもできます。同期先プロバイダーは、同期元プロバイダーによって承認されるフィルターが見つかるまで、異なるフィルターを要求できます。このネゴシエーションは Sync Framework の仲介の下で行われます。これによってプロバイダーに最も適した種類のフィルターが選択されます。
Sync Framework は BeginSession を呼び出した後フィルター ネゴシエーションを開始します。同期先プロバイダーに IRequestFilteredSync が実装されている場合、Sync Framework はこのインターフェイスの SpecifyFilter メソッドを呼び出します。このメソッドの中で、同期先プロバイダーはフィルターが承認されるまでフィルターを FilterRequestCallback デリゲートに渡し続けます。このデリゲートは、同期元プロバイダーの TryAddFilter メソッドを呼び出して同期元プロバイダーにフィルターを渡します。このメソッドの中で、同期元プロバイダーは要求されたフィルターの承認または拒否を行います。フィルターを承認したら、同期元プロバイダーはそのフィルターを通過する項目または変更単位のみを含むフィルター済みの変更バッチを作成します。
ビルド要件
.NET Framework 2.0 以降
例
このトピック内のコード例は、フィルターを追跡する 2 つのプロバイダー間でカスタム フィルターをネゴシエートする方法を示します。
フィルターの要求
同期先プロバイダーには IRequestFilteredSync が実装されているので、Sync Framework がこのインターフェイスの SpecifyFilter メソッドを呼び出します。このメソッド内で、同期先プロバイダーは FilterRequestCallback デリゲートを使って、追跡されたフィルターの一覧中の最初のフィルターを使用してフィルター済み変更バッチを作成するように同期元プロバイダーに要求します。同期先のプロバイダーはフィルターを追跡するので、フィルター選択の種類として CurrentItemsAndVersionsForMovedOutItems を指定します。同期元のプロバイダーがフィルターを拒否した場合、同期先プロバイダーは SyncInvalidOperationException をスローして、合意できるフィルターがなく、同期元プロバイダーに同期できないことを示します。
public void SpecifyFilter(FilterRequestCallback filterRequest)
{
// Use the first tracked filter as the filter for sync.
if (0 < _ContactStore.TrackedFilters.Count)
{
_filterForSync = _ContactStore.TrackedFilters[0];
}
// The source provider must agree to send a filtered change batch.
if (!filterRequest(_filterForSync, FilteringType.CurrentItemsAndVersionsForMovedOutItems))
{
throw new SyncInvalidOperationException("Filter specified by SpecifyFilter was rejected.");
}
}
フィルターの承認
同期元プロバイダーには ISupportFilteredSync が実装されているので、同期先プロバイダーによって FilterRequestCallback デリゲートへの呼び出しが行われるごとに、Sync Framework はこのインターフェイスの TryAddFilter メソッドを一度呼び出します。このメソッド内で、同期元プロバイダーは追跡されるフィルターの一覧を列挙し、要求されたフィルターと同じものが見つかれば、そのフィルターを承認します。
public bool TryAddFilter(object filter, FilteringType filteringType)
{
_filterForSync = null;
// The filter must be tracked by both replicas.
for (int filterKey = 0; filterKey < _filterKeyMap.Count; filterKey++)
{
if (_filterKeyMap[filterKey].IsIdentical((ISyncFilter)filter))
{
_filterForSync = (AddressFilter)_filterKeyMap[filterKey];
_filteringType = filteringType;
break;
}
}
return (null != _filterForSync);
}
次の手順
次は、項目フィルター、変更単位フィルター、カスタム フィルターなど Sync Framework に用意されている各種のフィルターの使用方法を学習することをお勧めします。フィルター選択の詳細については、「同期データのフィルター設定」を参照してください。