Partilhar via


Como negociar um filtro

Este tópico descreve como usar uma linguagem gerenciada para negociar o filtro que é usado para sincronização. O Sync Framework é usado para mediar a negociação entre os dois provedores.

Este tópico pressupõe uma familiaridade básica com os conceitos de C# e do Microsoft .NET Framework.

Os exemplos neste tópico se concentram nos seguintes membros e interfaces do Sync Framework:

Entendendo a negociação de filtro

O provedor de destino pode especificar o filtro usado pelo provedor de origem durante a enumeração de alterações. O provedor de origem pode aceitar ou negar o filtro solicitado pelo provedor de destino. O provedor de destino pode continuar a solicitar filtros até encontrar um que seja aceito pelo provedor de origem. Essa negociação é mediada pelo Sync Framework. O filtro pode ser do tipo que for mais apropriado para os provedores.

O Sync Framework inicia a negociação de filtro depois de chamar BeginSession. Quando o provedor de destino implementa IRequestFilteredSync, o Sync Framework chama seu método SpecifyFilter. Nesse método, o provedor de destino transmite filtros ao delegado FilterRequestCallback até que um seja aceito. Esse delegado transmite o filtro ao provedor de origem chamando seu método TryAddFilter. Nesse método, o provedor de origem aceita ou nega o filtro solicitado. Se aceitar um filtro, o provedor de origem deverá usá-lo para gerar lotes de alterações filtradas que incluem apenas itens ou unidades de alteração que transmitem o filtro.

Requisitos de compilação

Exemplo

O código de exemplo neste tópico mostra como negociar um filtro personalizado entre dois provedores que controlam filtros.

Solicitando o filtro

O provedor de destino implementa IRequestFilteredSync, assim, o Sync Framework chama seu método SpecifyFilter. Nesse método, o provedor de destino usa o delegado FilterRequestCallback para solicitar que o primeiro filtro da sua lista de filtros controlados seja usado pelo provedor de origem para gerar um lote de alterações filtradas. Como o provedor de destino controla o filtro, ele especifica um tipo de filtragem CurrentItemsAndVersionsForMovedOutItems. Se o provedor de origem negar o filtro, o provedor de destino lançará SyncInvalidOperationException para indicar que nenhum filtro foi aceito e que não pode fazer a sincronização com o provedor de origem.

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.");
    }
}

Aceitando o filtro

O provedor de origem implementa ISupportFilteredSync, assim, o Sync Framework chama seu método TryAddFilter uma vez para cada chamada feita pelo provedor de destino ao delegado FilterRequestCallback. Nesse método, o provedor de origem enumera sua lista de filtros controlados e, se um for igual ao filtro solicitado, ele aceitará o filtro.

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);
}

Próximas etapas

Talvez seja conveniente saber mais sobre como usar os vários filtros disponíveis no Sync Framework, como filtros de item, filtros de unidade de alteração e filtros personalizados. Para obter mais informações sobre filtragem, consulte Filtrando dados de sincronização.

Consulte também

Outros recursos

Programando tarefas comuns do provedor personalizado padrão

Filtrando dados de sincronização