Compartir a través de


Filtrar unidades de cambio enumeradas

En este tema se describe la forma de utilizar un lenguaje administrado para filtrar las unidades de cambio enumeradas por un proveedor de sincronización de Sync Framework que sincroniza los datos de un almacén de datos personalizado.

En este tema se presupone que se dispone de un conocimiento básico de C# y conceptos de Microsoft .NET Framework.

Los ejemplos de este tema se centran en las siguientes clases y miembros de Sync Framework:

Descripción del filtrado de unidades de cambio

Los filtros de unidades de cambio restringen los datos de sincronización a un subconjunto de unidades de cambio, por ejemplo para sincronizar únicamente los campos de nombre y número de teléfono de un contacto, omitiendo las unidades de cambio restantes. Un filtro de unidades de cambio resulta útil cuando una réplica almacena exclusivamente un subconjunto de las unidades de cambio definidas para los elementos del ámbito.

Sync Framework proporciona el objeto ChangeUnitListFilterInfo para definir la lista de unidades de cambio que se han de incluir en una enumeración de cambios. El filtro lo puede establecer la aplicación de sincronización utilizando un mecanismo que sea adecuado entre la aplicación y el proveedor, o se puede negociar entre los dos proveedores. Para obtener más información acerca de la negociación de filtros, vea Filtrar los datos de sincronización.

Cuando se define un filtro de unidades de cambio, Sync Framework solicita datos solamente para las unidades de cambio que están en el filtro cuando llama al método LoadChangeData del proveedor de origen.

El proveedor de destino recibe y aplica los cambios del mismo modo que en el caso de un lote de cambios estándar, con la excepción de que los datos enviados a SaveChangeWithChangeUnits contienen solamente las unidades de cambio que están en el filtro.

Requisitos de la generación

Ejemplo

El código de ejemplo de este tema muestra cómo utilizar el servicio de almacenamiento de metadatos para crear un lote de cambios que filtre las unidades de cambio que están incluidas en el lote de cambios. La réplica de este ejemplo es un archivo de texto que almacena información de contacto en forma de lista de valores separados por comas. Los elementos para sincronizar son los contactos que contiene este archivo. El filtro se define para incluir solamente los campos de nombre y número de teléfono del contacto.

Establecer el filtro

El proveedor de origen implementa un método público que permite a la aplicación establecer un filtro de unidades de cambio que define qué campos de contacto se han de incluir al enumerar los cambios.

public void SetContactFieldsToInclude(Contact.ChangeUnitFields[] includedFields)
{
    // Translate the array of fields to a list of IDs.
    _includedChangeUnits = new List<SyncId>(includedFields.Length);
    for (int iField = 0; iField < includedFields.Length; iField++)
    {
        _includedChangeUnits.Add(new SyncId((byte)includedFields[iField]));
    }

    _isFiltered = true;
}

La aplicación de sincronización crea el proveedor de origen como proveedor local y utiliza el método SetContactFieldsToInclude para especificar que solamente se han de incluir los campos de nombre y número de teléfono al enumerar los cambios. La aplicación también crea el proveedor de destino y realiza la sincronización.

private void SynchronizeWithChangeUnitFiltering(ContactStore localStore, ContactStore remoteStore, SyncDirectionOrder syncDir)
{
    // Create the local provider and set the change unit filter.
    // The filter is ignored when the provider is the destination provider.
    SyncProvider localProvider = new ContactsProviderChangeUnitFiltering(localStore);
    // Only include name and phone number fields.
    Contact.ChangeUnitFields[] includedFields = new Contact.ChangeUnitFields[2];
    includedFields[0] = Contact.ChangeUnitFields.NameCU;
    includedFields[1] = Contact.ChangeUnitFields.PhoneCU;
    ((ContactsProviderChangeUnitFiltering)localProvider).SetContactFieldsToInclude(includedFields);
    
    // Create the remote provider and do not set a filter.
    SyncProvider remoteProvider = new ContactsProviderChangeUnitFiltering(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");
}

Enumerar un lote de cambios filtrado

El proveedor de origen implementa GetChangeBatch para que, cuando se haya especificado un filtro, utilice Metadata Storage Service para crear un lote de cambios filtrado. Esto se realiza creando un objeto ChangeUnitListFilterInfo, inicializándolo con la lista especificada de unidades de cambio que se han de incluir. La información del filtro se pasa al método GetFilteredChangeBatch del objeto ReplicaMetadata. Metadata Storage Service no necesita volver a llamar al proveedor para determinar qué se ha de incluir en el filtro, por lo que se especifica null para el parámetro filterCallback.

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;

    ChangeBatch retrievedBatch;
    if (_isFiltered)
    {
        // Use the metadata storage service to get a filtered batch of changes.
        ChangeUnitListFilterInfo filterInfo = new ChangeUnitListFilterInfo(IdFormats, _includedChangeUnits, true);
        retrievedBatch = _ContactStore.ContactReplicaMetadata.GetFilteredChangeBatch(batchSize, destinationKnowledge,
            filterInfo, null);
    }
    else
    {
        // Use the metadata storage service to get a batch of changes.
        retrievedBatch = _ContactStore.ContactReplicaMetadata.GetChangeBatch(batchSize, destinationKnowledge);
    }
    
    return retrievedBatch;
}

Pasos siguientes

A continuación, puede agregar la negociación de filtros al proveedor de modo que pueda comunicar con el proveedor de destino para establecer el filtro que se ha de usar en la enumeración de cambios. Para obtener más información sobre cómo se negocian los filtros, vea Negociar un filtro.

Vea también

Conceptos

Programar tareas comunes de un proveedor personalizado estándar
Filtrar los datos de sincronización