如何协商筛选器

本主题说明如何使用托管语言协商用于同步的筛选器。使用 Sync Framework 来仲裁两个提供程序之间的协商。

本主题假定您基本熟悉 C# 和 Microsoft .NET Framework 概念。

本主题中的示例着重介绍以下 Sync Framework 接口和成员:

了解筛选器协商

目标提供程序可以指定在变更枚举期间由源提供程序使用的筛选器。源提供程序可以接受或拒绝目标提供程序请求的筛选器。目标提供程序可以继续请求筛选器,直到找到一个源提供程序接受的筛选器。该协商由 Sync Framework 控制。筛选器可以是最适合于提供程序的任何类型。

Sync Framework 在调用 BeginSession 后启动筛选器协商。目标提供程序实现 IRequestFilteredSync 时,Sync Framework 调用其 SpecifyFilter 方法。在此方法中,目标提供程序将筛选器传递给 FilterRequestCallback 委托,直到一个筛选器被接受。此委托通过调用其 TryAddFilter 方法将该筛选器传递给源提供程序。在此方法中,源提供程序接受或拒绝请求的筛选器。如果源提供程序接受一个筛选器,它必须使用该筛选器生成筛选的变更批,这些批只包括未被该筛选器滤掉的项或变更单位。

生成要求

示例

本主题中的示例代码演示如何在跟踪筛选器的两个提供程序间协商一个自定义筛选器。

请求筛选器

由于目标提供程序实现 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,因此 Sync Framework 对于目标提供程序对 FilterRequestCallback 委托的每次调用调用一次其 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 中提供的各种筛选器(如项筛选器、变更单位筛选器和自定义筛选器)的更多信息。有关筛选的更多信息,请参见筛选同步数据

请参阅

概念

对常见标准自定义提供程序任务进行编程
筛选同步数据