Partager via


Procédure : filtrer des unités de modification énumérées

Cette rubrique explique comment utiliser un langage managé pour filtrer les unités de modification énumérées par un fournisseur de synchronisation Sync Framework qui synchronise les données à partir d'un magasin de données personnalisé.

Cette rubrique suppose une connaissance de base des concepts C# et Microsoft .NET Framework.

Les exemples de cette rubrique reposent sur les classes et les membres Sync Framework suivants :

Présentation du filtrage des unités de modification

Les filtres d'unités de modification restreignent les données de synchronisation à un sous-ensemble d'unités de modification, de façon par exemple à ne synchroniser que les champs du nom et du numéro de téléphone d'un contact, en ignorant les autres unités de modification. Un filtre d'unités de modification est utile lorsqu'un réplica ne stocke qu'un sous-ensemble des unités de modification définies pour les éléments de l'étendue.

Sync Framework fournit l'objet ChangeUnitListFilterInfo pour définir la liste d'unités de modification à inclure dans une énumération des modifications. Le filtre peut être défini par l'application de synchronisation à l'aide d'un mécanisme approprié entre l'application et le fournisseur, mais il peut aussi être négocié entre les deux fournisseurs. Pour plus d'informations sur la négociation de filtres, consultez Filtrage des données de synchronisation.

Lorsqu'un filtre d'unité de modification est défini, Sync Framework demande uniquement des données pour les unités de modification qui sont dans le filtre lorsqu'il appelle le LoadChangeData du fournisseur de source.

Le fournisseur de destination reçoit et applique des modifications de la même façon que pour un lot de modifications standard, sauf que les données envoyées à SaveChangeWithChangeUnits contiennent uniquement les unités de modification qui sont dans le filtre.

Configuration de build

Exemple

L'exemple de code dans cette rubrique indique comment utiliser le service de stockage des métadonnées pour produire un lot de modifications qui filtre les unités de modification incluses dans le lot de modifications. Dans cet exemple, le réplica est un fichier texte qui stocke des coordonnées sous la forme d'une liste de valeurs séparées par des virgules. Les éléments à synchroniser sont les contacts contenus dans ce fichier. Le filtre est défini pour inclure uniquement les champs du nom et du numéro de téléphone du contact.

Définition du filtre

Le fournisseur de source implémente une méthode publique qui permet à l'application de configurer un filtre d'unité de modification qui définit les champs du contact à inclure lors de l'énumération des modifications.

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

L'application de synchronisation crée le fournisseur de source comme fournisseur local et utilise la méthode SetContactFieldsToInclude pour spécifier que seuls les champs du nom et du numéro de téléphone seront inclus lors de l'énumération des modifications. L'application crée également le fournisseur de destination et effectue la synchronisation.

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

Énumération d'un lot de modifications filtré

Le fournisseur de source implémente GetChangeBatch afin que, lorsqu'un filtre a été spécifié, il utilise le service de stockage des métadonnées pour produire un lot de modifications filtré. Cette opération est effectuée en créant un objet ChangeUnitListFilterInfo, en l'initialisant avec la liste spécifiée d'unités de modification à inclure. Les informations de filtre sont passées à la méthode GetFilteredChangeBatch de l'objet ReplicaMetadata. Le service de stockage des métadonnées n'ayant pas besoin de rappeler le fournisseur pour déterminer ce qu'il convient d'inclure dans le filtre, un null est spécifié pour le paramètre 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;
}

Étapes suivantes

Vous pouvez ensuite ajouter la négociation de filtres à votre fournisseur afin qu'il puisse communiquer avec le fournisseur de destination pour décider du filtre à utiliser pour l'énumération des modifications. Pour plus d'informations sur la négociation de filtres, consultez Procédure : négocier un filtre.

Voir aussi

Concepts

Programmation de tâches de fournisseurs personnalisés standard courantes
Filtrage des données de synchronisation