フィルター ネゴシエーションの方法

このトピックでは、マネージ言語を使って同期に使用するフィルターのネゴシエーションを行う方法を説明します。2 つのプロバイダー間でのネゴシエーションは Sync Framework が仲介します。

このトピックは、C# および Microsoft .NET Framework の概念について基本的な知識がある方を対象としています。

このトピックの例では、次に示す Sync Framework のインターフェイスとメンバーを中心に説明します。

フィルター ネゴシエーションについて

変更の列挙時に同期元プロバイダーによって使用されるフィルターは、同期先プロバイダーが同期元プロバイダーに対して指定することができます。同期元プロバイダーは、同期先プロバイダーから要求されたフィルターを受け入れることも、拒否することもできます。同期先プロバイダーは、同期元プロバイダーによって承認されるフィルターが見つかるまで、異なるフィルターを要求できます。このネゴシエーションは Sync Framework の仲介の下で行われます。これによってプロバイダーに最も適した種類のフィルターが選択されます。

Sync Framework は BeginSession を呼び出した後フィルター ネゴシエーションを開始します。同期先プロバイダーに IRequestFilteredSync が実装されている場合、Sync Framework はこのインターフェイスの SpecifyFilter メソッドを呼び出します。このメソッドの中で、同期先プロバイダーはフィルターが承認されるまでフィルターを FilterRequestCallback デリゲートに渡し続けます。このデリゲートは、同期元プロバイダーの TryAddFilter メソッドを呼び出して同期元プロバイダーにフィルターを渡します。このメソッドの中で、同期元プロバイダーは要求されたフィルターの承認または拒否を行います。フィルターを承認したら、同期元プロバイダーはそのフィルターを通過する項目または変更単位のみを含むフィルター済みの変更バッチを作成します。

ビルド要件

このトピック内のコード例は、フィルターを追跡する 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 に用意されている各種のフィルターの使用方法を学習することをお勧めします。フィルター選択の詳細については、「同期データのフィルター設定」を参照してください。

参照

概念

標準のカスタム プロバイダーをプログラミングするための一般的なタスク
同期データのフィルター設定