Filtrage de données pour les fournisseurs simples
Dans certaines situations, le réplica de destination n'a besoin que d'un sous-ensemble des données disponibles sur le réplica source. Par exemple, un commercial peut n'avoir besoin des informations détaillées des produits que pour les produits qu'il vend régulièrement. Les fournisseurs simples permettent aux réplicas de filtrer des données en implémentant une interface de filtrage. Le filtrage des données vous permet d'obtenir les résultats suivants :
Vous limitez la quantité de données envoyées sur le réseau.
Vous limitez la quantité d'espace de stockage nécessaire sur un réplica. Ceci est particulièrement important pour les périphériques.
Vous fournissez des partitions de données personnalisées en fonction des besoins des réplicas.
Vous évitez ou réduisez les conflits, car différentes partitions de données peuvent être envoyées à différents réplicas.
N'oubliez pas que les fournisseurs simples ne peuvent pas utiliser les filtres personnalisés, sinon des résultats inattendus peuvent se produire. Les filtres personnalisés sont des filtres qui utilisent la classe CustomFilterInfo (pour le code managé) ou l'interface ICustomFilterInfo (pour le code non managé).
Pour filtrer des données, utilisez les interfaces suivantes :
Code managé : IFilteredSimpleSyncProvider, IRequestFilteredSync et ISupportFilteredSync
Code natif : IFilteredSimpleSyncProvider, IRequestFilteredSync et ISupportFilteredSync
Exemple de code managé
L'exemple de code suivant utilise des interfaces de négociation des filtres pour déterminer si un filtre spécifique doit être utilisé pendant une session de synchronisation. La négociation des filtres permet à un fournisseur de destination de spécifier que le fournisseur de source doit utiliser un ou plusieurs filtres pendant l'énumération des modifications ; le fournisseur de source peut accepter ou rejeter un filtre. Si un fournisseur de source ne prend en charge aucun des filtres demandés, le fournisseur de destination peut choisir de recevoir toutes les données et procéder lui-même au filtrage. Sync Framework appelle les fournisseurs en conséquence pour négocier l'utilisation des filtres.
public bool RequestFilter
{
set
{
_requestFilter = value;
}
}
private bool _requestFilter = false;
void IRequestFilteredSync.SpecifyFilter(FilterRequestCallback filterRequest)
{
// Request a filter only if this provider represents a filtered replica.
if (_requestFilter)
{
if (!filterRequest("TheFilter", FilteringType.CurrentItemsOnly))
{
throw new SyncInvalidOperationException("Could not agree on filter.");
}
}
}
bool ISupportFilteredSync.TryAddFilter(object filter, FilteringType filteringType)
{
if (!((string)filter).Equals("TheFilter"))
{
throw new Exception("Filter is incorrect");
}
// Remember the filter.
_filter = (string)filter;
return true;
}
private string _filter = "";
Public WriteOnly Property RequestFilter() As Boolean
Set(ByVal value As Boolean)
_requestFilter = value
End Set
End Property
Private _requestFilter As Boolean = False
Private Sub SpecifyFilter(ByVal filterRequest As FilterRequestCallback) Implements IRequestFilteredSync.SpecifyFilter
' Request a filter only if this provider represents a filtered replica.
If _requestFilter Then
If Not filterRequest("TheFilter", FilteringType.CurrentItemsOnly) Then
Throw New SyncInvalidOperationException("Could not agree on filter.")
End If
End If
End Sub
Private Function TryAddFilter(ByVal filter As Object, ByVal filteringType As FilteringType) As Boolean Implements ISupportFilteredSync.TryAddFilter
If Not DirectCast(filter, String).Equals("TheFilter") Then
Throw New Exception("Filter is incorrect")
End If
' Remember the filter.
_filter = DirectCast(filter, String)
Return True
End Function
Private _filter As String = ""
L'exemple de code suivant spécifie en premier lieu l'option de filtre None. Cela signifie que les éléments doivent être filtrés même s'ils sont déjà connus de la destination. L'exemple de code implémente ensuite la méthode IsItemInFilterScope, qui filtre alors des éléments selon l'une des valeurs de champs d'éléments. Après avoir défini le filtre, l'exemple de code implémente la méthode UseFilterThisSession. Cela permet à une application de spécifier si le filtrage doit être utilisé session par session.
SimpleSyncProviderFilterOptions IFilteredSimpleSyncProvider.FilterOptions
{
get
{
return SimpleSyncProviderFilterOptions.None;
}
}
bool IFilteredSimpleSyncProvider.IsItemInFilterScope(ItemFieldDictionary KeyAndVersion)
{
ulong itemId = (ulong)KeyAndVersion[1].Value;
ItemData itemData = _store.Get(itemId);
if (itemData["data"] == "3333")
{
return false;
}
return true;
}
bool IFilteredSimpleSyncProvider.UseFilterThisSession
{
get
{
// Indicate whether a filter has been requested and agreed upon for this session.
return ("" != _filter);
}
}
Private ReadOnly Property FilterOptions() As SimpleSyncProviderFilterOptions Implements IFilteredSimpleSyncProvider.FilterOptions
Get
Return SimpleSyncProviderFilterOptions.None
End Get
End Property
Private Function IsItemInFilterScope(ByVal KeyAndVersion As ItemFieldDictionary) As Boolean Implements IFilteredSimpleSyncProvider.IsItemInFilterScope
Dim itemId As ULong = KeyAndVersion(1).Value
Dim data As ItemData = _store.Get(itemId)
If data("data") Is "3333" Then
Return False
End If
Return True
End Function
Private ReadOnly Property UseFilterThisSession() As Boolean Implements IFilteredSimpleSyncProvider.UseFilterThisSession
Get
' Indicate whether a filter has been requested and agreed upon for this session.
Return "" Is _filter
End Get
End Property