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
.NET Framework 2.0 ou posterior.
Referência ao Microsoft.Synchronization.
Referência ao Microsoft.Synchronization.MetadataStorage.
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.