Поделиться через


Как согласовать фильтр

В этом разделе описано, как согласовать фильтр, используемый при синхронизации, с помощью управляемого кода. В качестве посредника при согласовании фильтра между двумя поставщиками используется платформа 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 вызывает метод TryAddFilter однократно для каждого вызова делегата FilterRequestCallback, произведенного поставщиком назначения. В этом методе поставщик источника перечисляет список отслеживаемых фильтров и, если один из них совпадает с запрошенным, принимает его.

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, таких как фильтры элементов, фильтры базовых единиц и пользовательские фильтры. Дополнительные сведения о фильтрации см. в разделе Фильтрация данных синхронизации.

См. также

Основные положения

Программирование типовых задач стандартных пользовательских поставщиков
Фильтрация данных синхронизации