Como filtrar itens enumerados
Este tópico descreve como usar uma linguagem gerenciada para filtrar os itens enumerados por um provedor de sincronização do Sync Framework que sincroniza dados de um repositório de dados personalizado.
Este tópico pressupõe uma familiaridade básica com os conceitos de C# e Microsoft .NET Framework.
Os exemplos deste tópico se concentram nas seguintes classes e membros do Sync Framework:
Entendendo a filtragem de itens
Um filtro de item restringe as alterações de item que são enviadas pelo provedor de origem durante a enumeração de alterações, como para enviar apenas arquivos .txt em uma pasta de arquivos, ignorando arquivos de outros tipos. Os itens não devem ser alterados de forma a fazer um item existente ser inserido ou removido do filtro. É simples usar os filtros de item, mas os metadados usados para a sincronização aumentam proporcionalmente ao número de itens existentes no escopo de sincronização. Se houver uma preocupação com o armazenamento, os filtros personalizados serão apropriados. Para obter mais informações sobre filtragem personalizada, consulte Filtrando dados de sincronização.
A forma como os itens são filtrados é definida externamente ao Sync Framework, geralmente pelo desenvolvedor de provedor ou por terceiros. O filtro pode ser definido pelo aplicativo de sincronização usando qualquer mecanismo apropriado entre o aplicativo e o provedor, ou pode ser negociado entre os dois provedores. Para obter mais informações sobre negociação de filtros, consulte Filtrando dados de sincronização.
O provedor de destino recebe e aplica alterações da mesma forma que para um lote de alterações padrão. Ele não exige nenhuma ação especial para responder pela filtragem.
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 implementar um filtro de item simples e como usar o serviço de armazenamento de metadados para gerar um lote de alterações filtrado. A réplica deste exemplo é um arquivo de texto que armazena informações de contato como uma lista de valores separados por vírgula. Os itens a serem sincronizados são os contatos contidos nesse arquivo. O filtro é definido para incluir apenas os contatos com um campo de data de nascimento inferior ao valor especificado pelo aplicativo.
Definindo o filtro
O provedor de origem implementa um método público que permite ao aplicativo definir um filtro que define o valor máximo para o campo de data de nascimento. Qualquer contato com um valor maior que esse no campo de data de nascimento não será incluído em um lote de alterações.
public void SetMaximumBirthdateFilter(DateTime maxBirthdateFilter)
{
// Store the fact that a filter is set, and the value of the filter.
_isFiltered = true;
_maxBirthdateFilter = maxBirthdateFilter;
}
O aplicativo de sincronização cria o provedor de origem como provedor local e usa o método SetMaximumBirthdateFilter
para especificar a data de nascimento máxima a ser incluída ao enumerar alterações. O aplicativo também cria o provedor de destino e executa a sincronização.
private void SynchronizeWithItemFiltering(ContactStore localStore, ContactStore remoteStore, SyncDirectionOrder syncDir)
{
// Create the local provider and set the item filter.
// The filter is ignored when the provider is the destination provider.
SyncProvider localProvider = new ContactsProviderItemFiltering(localStore);
// Only include contacts with a birthdate before January 1, 2000.
((ContactsProviderItemFiltering)localProvider).SetMaximumBirthdateFilter(
new DateTime(2000, 1, 1));
// Create the remote provider and do not set a filter.
SyncProvider remoteProvider = new ContactsProviderItemFiltering(remoteStore);
// Create the synchronization orchestrator and set the providers and synchronization direction.
SyncOrchestrator orchestrator = new SyncOrchestrator();
orchestrator.LocalProvider = localProvider;
orchestrator.RemoteProvider = remoteProvider;
orchestrator.Direction = syncDir;
string msg;
try
{
// Synchronize data between the two providers.
SyncOperationStatistics stats = orchestrator.Synchronize();
// Display statistics for the synchronization operation.
msg = "Synchronization succeeded!\n\n" +
stats.DownloadChangesApplied + " download changes applied\n" +
stats.DownloadChangesFailed + " download changes failed\n" +
stats.UploadChangesApplied + " upload changes applied\n" +
stats.UploadChangesFailed + " upload changes failed";
}
catch (Exception ex)
{
msg = "Synchronization failed! Here's why: \n\n" + ex.Message;
}
MessageBox.Show(msg, "Synchronization Results");
}
Enumerando um lote de alterações filtrado
O provedor de origem implementa GetChangeBatch de forma que, quando um filtro tiver sido especificado, ele usará o serviço de armazenamento de metadados para gerar um lote de alterações filtrado. Isso é feito criando um objeto ItemListFilterInfo e o passando para o método GetFilteredChangeBatch do objeto ReplicaMetadata.
public override ChangeBatch GetChangeBatch(uint batchSize, SyncKnowledge destinationKnowledge, out object changeDataRetriever)
{
// Return this object as the IChangeDataRetriever object that is called to retrieve item data.
changeDataRetriever = this;
// Use the metadata storage service to get a batch of changes.
ChangeBatch retrievedBatch;
if (_isFiltered)
{
// If a filter is set, get a filtered change batch from the metadata storage service.
// The BirthdateFilterCallback method indicates whether an item passes the filter.
ItemListFilterInfo filterInfo = new ItemListFilterInfo(IdFormats);
retrievedBatch = _ContactStore.ContactReplicaMetadata.GetFilteredChangeBatch(batchSize, destinationKnowledge,
filterInfo, BirthdateFilterCallback);
}
else
{
retrievedBatch = _ContactStore.ContactReplicaMetadata.GetChangeBatch(batchSize, destinationKnowledge);
}
return retrievedBatch;
}
Para determinar se um item está incluído no filtro, o método GetFilteredChangeBatch usa um representante ItemFilterCallback implementado pelo provedor de origem. O serviço de armazenamento de metadados chama esse representante e usa o valor de retorno para incluir ou excluir itens do lote de alterações. Neste exemplo, um item é incluído no lote de alterações quando o valor do campo de data de nascimento é menor que a data de nascimento máxima especificada.
public bool BirthdateFilterCallback(ItemMetadata itemMeta)
{
// An item passes the filter only if its birthdate field is less than the maximum birthdate
// specified by the filter.
return (_ContactStore.ContactList[itemMeta.GlobalId].Birthdate < _maxBirthdateFilter);
}
Próximas etapas
Em seguida, você pode adicionar a negociação de filtro ao seu provedor de forma que ele possa se comunicar com o provedor de destino a fim de estabelecer o filtro que deve ser usado para a enumeração de alterações. Para obter mais informações sobre como negociar filtros, consulte Como negociar um filtro.
Você também pode usar um filtro personalizado em vez de um filtro de item. É mais trabalhoso implementar os filtros personalizados, mas eles são muito mais eficientes de acompanhar e se comunicar; assim, seu uso mantém os metadados de sincronização pequenos. Para obter mais informações sobre filtros personalizados, consulte Filtrando dados de sincronização.
Consulte também
Conceitos
Programando tarefas comuns do provedor personalizado padrão
Filtrando dados de sincronização