Il presente articolo è stato tradotto automaticamente.

Sincronizzazione

Creazione di provider di sincronizzazione con Sync Framework

Joydip Kanjilal

Scaricare il codice di esempio

Microsoft Sync Framework è una piattaforma completa per la sincronizzazione dei dati in linea e non in linea e facilita la collaborazione e l'accesso non in linea per applicazioni, servizi e dispositivi simili. È indipendente dal protocollo e database e include tecnologie e strumenti che consentono di dispositivi mobili, la condivisione e la possibilità di eseguire in rete dati non in linea prima della sincronizzazione viene di nuovo in un secondo tempo.

Sync Framework può essere utilizzato per creare applicazioni per la sincronizzazione dei dati da qualsiasi archivio dati utilizzando qualsiasi protocollo di rete. È una piattaforma completa sincronizzazione che semplifica l'accesso ai dati in linea e per applicazioni, servizi e dispositivi. Sync Framework dispone di un modello di provider estensibile e utilizzabili con codice gestito e sincronizzare i dati tra due origini dati.

In questo articolo consente di esaminare i concetti di sincronizzazione e come Sync Framework può essere integrato nei propri progetti. In particolare, verrà da discutere i principi fondamentali della sincronizzazione dei dati, i componenti dell'architettura di Sync Framework e le modalità di utilizzo di provider di sincronizzazione.

Per utilizzare Sync Framework ed esempi di codice riportati in questo articolo, è necessario installare Visual Studio 2010 e di Common Language runtime Sync Framework 2.0 o versione successivo. È possibile scaricare il runtime con Microsoft Sync Framework 2.0 Redistributable Package da Sync Framework Developer Center.

Introduzione a Sync Framework

Sync Framework è costituito da quattro componenti principali: un runtime, servizi di metadati, provider di sincronizzazione e i partecipanti.

Sync Framework Common Language runtime fornisce l'infrastruttura per la sincronizzazione dei dati tra origini dati. Fornisce inoltre un SDK che gli sviluppatori possono estendere per implementare provider personalizzati.

Servizi metadati forniscono l'infrastruttura per l'archiviazione dei metadati di sincronizzazione, che contiene informazioni utilizzate durante una sessione di sincronizzazione. Metadati di sincronizzazione includono versioni, gli ancoraggi e modificano le informazioni di rilevamento. Si utilizzeranno inoltre i metadati di sincronizzazione nella progettazione e sviluppo di provider personalizzati.

Provider di sincronizzazione consente di sincronizzare i dati fra repliche o endpoint. Una replica è un'unità di sincronizzazione e viene utilizzata per indicare l'archivio dati effettivi. Ad esempio, se si stanno la sincronizzazione dei dati tra due database, quindi ogni database viene definito come replica. Una replica viene identificata tramite un identificatore univoco, denominato chiave replica. Un punto finale fa riferimento anche a un archivio dati. Descriverò i provider in dettaglio più avanti in questo articolo.

Un partecipante si riferisce al percorso in cui è possibile recuperare i dati da sincronizzare. Può trattarsi di partecipanti completi, parziali partecipanti e semplici ai partecipanti.

Completi i partecipanti sono dispositivi che possono creare nuovi archivi di dati, memorizzare le informazioni sui metadati di sincronizzazione ed eseguire applicazioni di sincronizzazione su periferiche stesse. Sono esempi di partecipanti completi computer desktop, computer portatili e Tablet PC. Un partecipante completo è possibile sincronizzare i dati con un altro partecipante.

I partecipanti parziali sono dispositivi che possono creare nuovi archivi di dati e le informazioni sui metadati di sincronizzazione archivio, ma non possono eseguire applicazioni autonomamente. Una periferica di archiviazione USB o smartphone potrebbe essere un partecipante parziale. Si noti che un partecipante parziale possibile sincronizzare i dati con un partecipante completo, ma non a un altro partecipante parziale.

I partecipanti semplici includono periferiche che non possono archiviare nuovi dati o eseguire le applicazioni, ma solo può fornire le informazioni richieste. Sono esempi di semplici partecipanti feed RSS e servizi Google Web e Amazon.

Provider di sincronizzazione

Un provider di sincronizzazione è un componente che può far parte di un processo di sincronizzazione e consente una replica di dati di sincronizzazione con altre repliche. È un provider di sincronizzazione per ogni replica.

Per sincronizzare i dati, viene avviata una sessione di sincronizzazione. L'applicazione si connette al provider di sincronizzazione origine e destinazione della sessione per facilitare la sincronizzazione dei dati tra le repliche.

Quando una sessione di sincronizzazione, provider di destinazione fornisce informazioni su relativo archivio dati del provider di origine. Il provider di origine determina quali modifiche alla replica di origine non sono noti per la replica di destinazione e quindi inserisce l'elenco di tali modifiche al provider di destinazione. Provider di destinazione quindi rileva eventuali conflitti tra i propri elementi e quelli presenti nell'elenco e quindi applica le modifiche al proprio archivio dati. Il motore di Sync Framework semplifica tutto il processo di sincronizzazione.

Sync Framework fornisce supporto per tre provider predefinito per il database, file system e sincronizzazione feed:

  • Provider di sincronizzazione per le origini dati abilitati all'utilizzo di ADO.NET
  • Provider di sincronizzazione per i feed RSS e Atom
  • Provider di sincronizzazione per file e cartelle

È inoltre possibile estendere Sync Framework per creare un provider personalizzato di sincronizzazione per lo scambio di informazioni tra periferiche e applicazioni.

Il provider di sincronizzazione del database (in precedenza denominato servizi di sincronizzazione per ADO.NET in Sync Framework 1.0) supporta la sincronizzazione delle origini dati ADO.NET abilitata. È possibile creare applicazioni di dati disconnessi facilitano la sincronizzazione tra origini dati abilitati all'utilizzo di ADO.NET, ad esempio SQL Server. Consente di roaming, la condivisione e la disattivazione dei dati. Qualsiasi database che utilizza il provider di database può partecipare al processo di sincronizzazione con altre origini dati supportate da Sync Framework compresi file System, servizi Web o archivi dati personalizzati anche.

Il provider di sincronizzazione Web (precedentemente noto come servizi di sincronizzazione per FeedSync) supporta la sincronizzazione di feed RSS e ATOM. Prima FeedSync, questa tecnologia era noto come estensioni condivisione semplice ed era stato originariamente sviluppata da Ray Ozzie. Si noti che il provider di sincronizzazione Web non sostituisce le tecnologie esistenti come RSS o Atom feed. Piuttosto, fornisce un modo semplice per aggiungere funzionalità di sincronizzazione RSS o Atom feed esistente in modo che possono essere utilizzati da altre applicazioni o servizi indipendenti dalla piattaforma o periferica in uso.

Il provider di sincronizzazione (precedentemente noto come servizi di sincronizzazione per File System) supporta la sincronizzazione di file e cartelle nel computer. Può essere utilizzato per sincronizzare i file e le cartelle nello stesso sistema o in sistemi in rete. È possibile sincronizzare i file e le cartelle in sistemi con NTFS, FAT o SMB file System. Il provider utilizza il modello metadati Sync Framework per consentire la sincronizzazione peer-to-peer di file di dati con il supporto per le topologie arbitrarie (client/server, full mesh e peer-to-peer) includono il supporto per i supporti rimovibili. Il provider di sincronizzazione consente inoltre la sincronizzazione incrementale, rilevamento conflitti e modifica, sincronizzazione in modalità anteprima e anteprima non operative e filtro e ignorare i file nel processo di sincronizzazione.

Utilizzo di provider di sincronizzazione incorporate

In questa sezione, illustrerò come utilizzare i provider di sincronizzazione incorporato per implementare una semplice applicazione che consente di sincronizzare il contenuto di due cartelle di sistema.

Per creare un provider di sincronizzazione del file è possibile utilizzare la classe FileSyncProvider. Questa classe estende la classe UnManagedSyncProvider e implementa l'interfaccia IDisposable. La classe FileSyncScopeFilter viene utilizzata per includere o escludere file e cartelle che prenderanno il processo di sincronizzazione.

FileSyncProvider rileva le modifiche nell'utilizzo dei metadati di sincronizzazione di replica. Sincronizzazione metadati contengono informazioni su tutti i file e le cartelle che fanno parte del processo di sincronizzazione. Esistono effettivamente due tipi di metadati di sincronizzazione: i metadati di replica e metadati dell'elemento. Il provider di sincronizzazione sono archiviati i metadati per tutti i file e le cartelle che fanno parte del processo di sincronizzazione. Successivamente, viene utilizzata la dimensione del file, gli attributi e l'ultimo accesso tempi di tali file e cartelle per rilevare le modifiche.

Aprire Visual Studio 2010 e creare un nuovo progetto Windows Presentation Foundation (WPF). Salvare il progetto con il nome SyncFiles. Aprire il file MainWindow.xaml e creare un form WPF simile a ciò che viene visualizzato in di Figura 1.

image: The Sample Sync App

Figura 1 di sincronizzazione App l'esempio

Come si può vedere, sono presenti controlli per selezionare le cartelle di origine e di destinazione. È inoltre possibile disporre i controlli per visualizzare le statistiche di sincronizzazione e il contenuto dell'origine e le cartelle di destinazione.

Fare doppio clic sul progetto in Esplora soluzioni, scegliere Aggiungi riferimento e aggiungere gli assembly Microsoft.Synchronization.

Aggiungere un nuovo metodo GetReplicaID nel file MainWindow.xaml.cs per restituire un GUID come mostrato nel codice di di Figura 2. Il metodo Synchronize, quando viene chiamato sull'istanza di SyncOrchestrator, crea un file di metadati denominato filesync.metadata in ognuna delle cartelle o repliche tramite il GUID univoco. Il metodo GetReplicaID mantiene questo GUID in un file in modo che la successiva chiamata al metodo non genera un nuovo GUID per quella particolare cartella. Metodo GetReplicaID controlla innanzitutto se è presente il file che contiene un ID di replica. Se il file non viene trovato, un nuovo ID di replica viene creato e archiviato nel file. Se il file esiste (perché in precedenza è stato generato un ID replica per la cartella), restituisce l'ID replica dal file.

Figura 2 di GetReplicaID

private Guid GetReplicaID(string guidPath) {
  if (!File.Exists(guidPath)) {
    Guid replicaID = Guid.NewGuid();
    using (FileStream fileStream = 
      File.Open(guidPath, FileMode.Create)) {
      using (StreamWriter streamWriter = 
        new StreamWriter(fileStream)) {

        streamWriter.WriteLine(replicaID.ToString());
      }
    }

    return replicaID;
  }
  else {
    using (FileStream fileStream = 
      File.Open(guidPath, FileMode.Open)) {
      using (StreamReader streamReader = 
        new StreamReader(fileStream)) {

        return new Guid(streamReader.ReadLine());
      }
    }
  }
}

Successivamente, aggiungere un metodo denominato GetFilesAndDirectories per restituire un elenco di file e cartelle nel percorso replica (vedere di Figura 3). Il nome della cartella deve essere passato a esso come parametro.

Figura 3 Getting Replica file e cartelle

private List<string> GetFilesAndDirectories(String directory) {
  List<String> result = new List<String>();
  Stack<String> stack = new Stack<String>();
  stack.Push(directory);

  while (stack.Count > 0) {
    String temp = stack.Pop();

    try {
      result.AddRange(Directory.GetFiles(temp, "*.*"));

      foreach (string directoryName in 
        Directory.GetDirectories(temp)) {
        stack.Push(directoryName);
      }
    }
    catch {
      throw new Exception("Error retrieving file or directory.");
    }
  }

  return result;
}

Questo metodo viene utilizzato per visualizzare l'elenco di file e cartelle all'interno di cartelle di origine e di destinazione prima e dopo il processo di sincronizzazione. I metodi PopulateSourceFileList e PopulateDestinationFileList chiamano GetFilesAndDirectories per popolare le caselle di riepilogo per visualizzare i file e le directory all'interno delle cartelle di origine e di destinazione (vedere il codice di download per i dettagli).

Il btnSource_Click e i gestori di eventi btnDestination_Click consente di selezionare l'origine e le cartelle di destinazione. Entrambi i metodi impiegano il FolderBrowser classe per visualizzare una finestra di dialogo da cui l'utente può selezionare le cartelle di origine o di destinazione. Il codice sorgente completo della classe FolderBrowser è disponibile per il download con il download del codice per questo articolo.

Ora è necessario scrivere il gestore eventi Click del controllo Button, a partire dalla disattivazione del pulsante prima dell'avvio della sincronizzazione. Quindi chiama il metodo di sincronizzazione con i percorsi di origine e di destinazione come parametri. Infine, avvia il processo di sincronizzazione, intercettare eventuali errori e attivare il pulsante al completamento della sincronizzazione:

btnSyncFiles.IsEnabled = false; 
// Disable the button before synchronization starts
Synchronize(sourcePath, destinationPath);
btnSyncFiles.IsEnabled = true; 
// Enable the button after synchronization is complete

Il metodo Synchronize accetta il percorso di origine e di destinazione e sincronizza il contenuto di due repliche. Nel metodo Synchronize prendo un'istanza della classe SyncOperationStatistics per recuperare le informazioni statistiche sul processo di sincronizzazione:

SyncOperationStatistics syncOperationStatistics;

È possibile anche creare provider di sincronizzazione di origine e destinazione, crea un'istanza di SyncOrchestrator denominata synchronizationAgent, assegnare i GUID per le repliche di origine e di destinazione e collegare due provider. Il SyncOrchestrator è responsabile del coordinamento della sessione di sincronizzazione:

sourceReplicaID = 
  GetReplicaID(Path.Combine(source,"ReplicaID"));
destinationReplicaID = 
  GetReplicaID(Path.Combine(destination,"ReplicaID"));

sourceProvider = 
  new FileSyncProvider(sourceReplicaID, source);
destinationProvider = 
  new FileSyncProvider(destinationReplicaID, destination); 

SyncOrchestrator synchronizationAgent = 
  new SyncOrchestrator();
synchronizationAgent.LocalProvider = sourceProvider;
synchronizationAgent.RemoteProvider = destinationProvider;

Infine, è possibile avviare il processo di sincronizzazione, intercettare eventuali errori e rilasciare le risorse come appropriate, come illustrato in di Figura 4. Download del codice per questo articolo include il progetto di origine completo con la gestione degli errori e altri dettagli di implementazione.

Figura 4 sincronizzazione repliche

try {
  syncOperationStatistics = synchronizationAgent.Synchronize(); 

  // Assign synchronization statistics to the lstStatistics control
  lstStatistics.Items.Add("Download Applied: " + 
    syncOperationStatistics.DownloadChangesApplied.ToString());
  lstStatistics.Items.Add("Download Failed: " + 
    syncOperationStatistics.DownloadChangesFailed.ToString());
  lstStatistics.Items.Add("Download Total: " + 
    syncOperationStatistics.DownloadChangesTotal.ToString());
  lstStatistics.Items.Add("Upload Total: " + 
    syncOperationStatistics.UploadChangesApplied.ToString());
  lstStatistics.Items.Add("Upload Total: " + 
    syncOperationStatistics.UploadChangesFailed.ToString());
  lstStatistics.Items.Add("Upload Total: " + 
    syncOperationStatistics.UploadChangesTotal.ToString());
}
catch (Microsoft.Synchronization.SyncException se) {
  MessageBox.Show(se.Message, "Sync Files - Error");
}
finally {
  // Release resources once done
  if (sourceProvider != null) 
    sourceProvider.Dispose();
  if (destinationProvider != null) 
    destinationProvider.Dispose();
}

Puoi anche segnalare l'avanzamento della sincronizzazione per una sessione di sincronizzazione. Per implementare questo, attenersi alla seguente procedura:

  1. Registrare un gestore eventi per l'evento ApplyingChange.
  2. Attivare la modalità di anteprima impostando la proprietà PreviewMode di FileSyncProvider su true.
  3. Richiedere un contatore integer e aumenta ogni volta che viene generato l'evento di modifica applicazione ­.
  4. Avviare il processo di sincronizzazione.
  5. Impostare la proprietà PreviewMode FileSyncProvider su false per disattivare PreviewMode.
  6. Avviare nuovamente il processo di sincronizzazione.

Filtraggio e omissione del file

Durante la sincronizzazione utilizzando Sync Framework, alcuni file vengono ignorati automaticamente, inclusi desktop.ini e Thumbs.DB, i file con attributi nascosti e di sistema e i file di metadati. È possibile applicare filtri statici per controllare file e cartelle che si desidera sincronizzare. In particolare, questi filtri escludere i file che non si desidera far parte del processo di sincronizzazione.

Per utilizzare i filtri statici, creare un'istanza della classe FileSyncScopeFilter e passare i filtri di esclusione e inclusione come parametri al costruttore. È anche possibile utilizzare il metodo FileNameExcludes.Add sull'istanza FileSyncScopeFilter per escludere uno o più file dalla sessione di sincronizzazione. È quindi possibile passare questa istanza FileSyncScopeFilter durante la creazione dell'istanza FileSyncProvider. Ecco un esempio:

FileSyncScopeFilter fileSyncScopeFilter = 
  new FileSyncScopeFilter();
fileSyncScopeFilter.FileNameExcludes.Add("filesync.id");
FileSyncProvider fileSyncProvider = 
  new FileSyncProvider(Guid.NewGuid(), 
  "D:\\MyFolder",fileSyncScopeFilter,FileSyncOptions.None);

Analogamente, è possibile escludere tutti i file con estensione lnk dal processo di sincronizzazione:

FileSyncScopeFilter fileSyncScopeFilter = 
  new FileSyncScopeFilter();
fileSyncScopeFilter.FileNameExcludes.Add("*.lnk");

È anche possibile utilizzare FileSyncOptions per impostare in modo esplicito le opzioni per la sessione di sincronizzazione:

FileSyncOptions fileSyncOptions = 
  FileSyncOptions.ExplicitDetectChanges | 
  FileSyncOptions.RecycleDeletedFiles |
  FileSyncOptions.RecyclePreviousFileOnUpdates |
  FileSyncOptions.RecycleConflictLoserFiles;

Per ignorare uno o più file durante il processo di sincronizzazione, registrare un gestore eventi dell'evento ApplyingChange e impostare la proprietà SkipChange su true:

FileSyncProvider fileSyncProvider;
fileSyncProvider.AppliedChange += 
  new EventHandler (OnAppliedChange);
destinationProvider.SkippedChange += 
  new EventHandler (OnSkippedChange);

Ora è possibile implementare il gestore eventi OnAppliedChange per visualizzare le modifiche apportate:

public static void OnAppliedChange(
  object sender, AppliedChangeEventArgs args) {
  switch (args.ChangeType) {
    case ChangeType.Create:
      Console.WriteLine("Create " + args.NewFilePath);
      break;
    case ChangeType.Delete:
      Console.WriteLine("Delete" + args.OldFilePath);
      break;
    case ChangeType.Overwrite:
      Console.WriteLine("Overwrite" + args.OldFilePath);
      break;
    default:
      break;
  }
}

Si noti che questo esempio è stato semplificato per maggiore chiarezza. Un'implementazione più efficace è incluso nel download del codice.

Per comprendere il motivo per cui un determinato file è stato ignorato durante la sessione di sincronizzazione, è possibile implementare il gestore eventi OnSkippedChange:

public static void OnSkippedChange(
  object sender, SkippedChangeEventArgs args) {

  if (args.Exception != null)
    Console.WriteLine("Synchronization Error: " + 
      args.Exception.Message); 
}

Generare ed eseguire l'applicazione. Fare clic sul pulsante origine cartelle selezionare la cartella di origine. Utilizzare la cartella di destinazione per selezionare la cartella di destinazione. Verrà visualizzato l'elenco di file di ciascuna cartella prima della sincronizzazione viene visualizzato nelle caselle di riepilogo corrispondenti (vedere di Figura 1). Nella casella di riepilogo statistiche di sincronizzazione non viene visualizzato nulla sincronizzazione è ancora da avviare.

Fare clic sul pulsante Sincronizza per avviare il processo di sincronizzazione. Dopo che sono state sincronizzate le cartelle di origine e di destinazione, verrà visualizzato il contenuto di entrambe le cartelle dopo la sincronizzazione nelle caselle di riepilogo corrispondente. Le statistiche di sincronizzazione casella di riepilogo vengono visualizzate le informazioni sulle attività che sono state completate (vedere di Figura 5).

image: Synchronization Finished

Figura 5 sincronizzazione completata

La gestione dei conflitti

Sync Framework gestisce tutte le complessità coinvolte nella sincronizzazione basata su timestamp che includono conflitti differiti, errori, interruzioni e cicli. Per gestire i conflitti quando è in corso una sessione di sincronizzazione, Sync Framework segue una delle seguenti strategie:

  • Origine Wins: Questa strategia, archiviare le modifiche apportate nell'origine dati in caso di conflitto vincono sempre.
  • Wins di destinazione: Questa strategia, archiviare le modifiche apportate nei dati di destinazione in caso di conflitto vincono sempre.
  • Unione: Questa strategia, in caso di conflitto le modifiche vengono unite.
  • Conflitto di registro: Questa è una strategia in cui il conflitto viene rinviato o registrato.

Il flusso di sincronizzazione

Un'istanza SyncOrchestrator controlla una sessione di sincronizzazione e il flusso dei dati durante la sessione. Il flusso di sincronizzazione è sempre unidirezionale e si dispone di un provider di origine associato alla replica di origine e un provider di destinazione associato alla replica di destinazione. Il primo passaggio consiste nel creare provider di origine e di destinazione, assegnare loro replica gli ID univoco e collegare due provider per le repliche di origine e di destinazione:

FileSyncProvider sourceProvider = 
  new FileSyncProvider(sourceReplicaID, @"D:\Source");
FileSyncProvider destinationProvider = 
  new FileSyncProvider(destinationReplicaID, @"D:\Destination");

Successivamente, creare un'istanza di SyncOrchestrator e collegare due provider. Una chiamata al metodo Synchronize sull'istanza SyncOrchestrator crea un collegamento tra l'origine e i provider di destinazione:

SyncOrchestrator syncAgent = new SyncOrchestrator();
syncAgent.LocalProvider = sourceProvider;
syncAgent.RemoteProvider = destProvider;
syncAgent.Synchronize();

Da quel momento, è possibile apportare un numero di chiamate da Sync Framework mentre è in corso una sessione di sincronizzazione. Let’s dettagliatamente li.

Provider di origine e di destinazione per indicare che è il provider di sincronizzazione per partecipare a una sessione di sincronizzazione viene chiamato BeginSession. Si noti che il metodo BeginSession genera InvalidOperationException se la sessione non può essere avviata o il provider non è inizializzato correttamente:

public abstract void BeginSession(
  SyncProviderPosition position, 
  SyncSessionContext syncSessionContext);

Sync Framework chiama GetSyncBatchParameters l'istanza del provider di destinazione. Il provider di destinazione restituisce la conoscenza (una rappresentazione compatta di versioni o modifiche è a conoscenza di una determinata replica) e le dimensioni del batch richiesto. Questo metodo accetta due parametri, ovvero batchSize e conoscenze out:

public abstract void GetSyncBatchParameters(
  out uint batchSize, 
  out SyncKnowledge knowledge);

Sync Framework richiama GetChangeBatch sul provider di origine. Questo metodo accetta due parametri di input, la dimensione del batch e la conoscenza di destinazione:

public abstract ChangeBatch GetChangeBatch(
  uint batchSize, 
  SyncKnowledge destinationKnowledge, 
  out object changeDataRetriever);

Il provider di sincronizzazione origine Invia adesso il riepilogo delle versioni modificate e conoscenze al provider di destinazione sotto forma di oggetto changeDataRetriever.

Viene chiamato il metodo ProcessChangeBatch dal provider di destinazione per elaborare le modifiche:

public abstract void ProcessChangeBatch(
  ConflictResolutionPolicy resolutionPolicy, 
  ChangeBatch sourceChanges, 
  object changeDataRetriever, 
  SyncCallbacks syncCallbacks, 
  SyncSessionStatistics sessionStatistics);

SaveItemChange viene chiamato provider di sincronizzazione di destinazione per tutte le modifiche apportate nel batch. Se si sta implementando un provider personalizzato, si deve aggiornare la replica di destinazione con le modifiche inviate tramite la replica di origine e quindi aggiornare i metadati nell'archivio dei metadati con la conoscenza di origine:

void SaveItemChange(SaveChangeAction saveChangeAction, 
  ItemChange  change, SaveChangeContext context);

StoreKnowledgeForScope viene chiamato provider di sincronizzazione di destinazione per salvare dati nell'archivio di metadati:

public void StoreKnowledgeForScope(
  SyncKnowledge knowledge, 
  ForgottenKnowledge forgottenKnowledge)

EndSession viene chiamato provider di origine e di destinazione per indicare che il provider di sincronizzazione sta per abbandonare la sessione di sincronizzazione che fa parte precedente:

public abstract void EndSession(
  SyncSessionContext syncSessionContext);

Provider personalizzati di sincronizzazione

Dopo aver visto come funzionano i provider di sincronizzazione predefinito. Come ho accennato prima, è inoltre possibile implementare i provider di sincronizzazione personalizzato. Un provider di sincronizzazione personalizzato estende le funzionalità di un provider di sincronizzazione incorporato. È necessario un provider personalizzato di sincronizzazione se nessun provider per gli archivi di dati da sincronizzare. È inoltre possibile creare un provider di sincronizzazione personalizzato che implementa modifica unità di misura per un migliore controllo sul rilevamento delle modifiche e ridurre il numero di conflitti.

Per creare un proprio provider di sincronizzazione, creare una classe che estenda la classe abstract KnowledgeSyncProvider e implementa le interfacce IChangeDataRetriever e INotifyingChangeApplierTarget. Si noti che tali classi e interfacce sono parte dello spazio dei nomi Microsoft.Synchronization.

Come esempio di un provider personalizzato, ad esempio che si desidera implementare un provider di sincronizzazione per la sincronizzazione dei dati tra database. Questo è solo una panoramica di un semplice esempio e può essere esteso per supportare scenari molto più complessi.

Iniziare creando tre database di SQL Server 2008 (è denominato li ReplicaA, ReplicaB e ReplicaC) e creare una tabella in ogni database di studenti. Il provider personalizzato verrà sincronizzare record tra le tabelle Student tre. Successivamente, creare un'entità denominata studenti per l'esecuzione di operazioni CRUD sulla tabella Student.

Creare una classe denominata studente con StudentID, FirstName, LastName come campi e metodi di supporto necessario per eseguire operazioni CRUD nel database:

public class Student {
  public int StudentID { get; set; }
  public String FirstName { get; set; }
  public String LastName { get; set; }
  //Helper methods for CRUD operations
...
}

Creare una classe denominata CustomDBSyncProvider ed estendere dalle interfacce KnowledgeSyncProvider, IChangeDataRetriever, INotifyingChangeApplierTarget e IDisposable:

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.MetadataStorage; 
public class CustomDBSyncProvider : KnowledgeSyncProvider, 
  IChangeDataRetriever, 
  INotifyingChangeApplierTarget,IDisposable {
...

Implementare i metodi necessari nel provider sincronizzazione database personalizzato e creare l'interfaccia utente per visualizzare il contenuto di tutte le tabelle Student (vedere il codice di download per questo articolo per ulteriori dettagli).

Ora creare tre istanze del provider di sincronizzazione personalizzato e collegare le tabelle di database di studenti. Infine, sincronizzare il contenuto di una replica con un altro con l'aiuto del provider di sincronizzazione personalizzato:

private void Synchronize(
  CustomDBSyncProvider sourceProvider, 
  CustomDBSyncProvider destinationProvider) {

  syncAgent.Direction = 
    SyncDirectionOrder.DownloadAndUpload;
  syncAgent.LocalProvider = sourceProvider;
  syncAgent.RemoteProvider = destinationProvider;
  syncStatistics = syncAgent.Synchronize();
}

Sincronizzati su

Come si è visto, Sync Framework fornisce una piattaforma di sincronizzazione semplice ma completo che fornisce una perfetta sincronizzazione tra i dati non in linea e in linea.Può essere utilizzato per sincronizzare dati indipendente dal protocollo e archivio dati in uso.Potrebbe essere utilizzato per il backup di file semplice o facilmente estesa per reti di collaborazione.È inoltre possibile creare provider di sincronizzazione personalizzato per supportare le origini dati che non sono gestite all'esterno della casella.

Joydip Kanjilal è un consulente software indipendente, nonché un Microsoft MVP in ASP.NET dal 2007. È anche un relatore e autore di numerosi libri e articoli e blog alaspadvice.com/blogs/joydip.

*Grazie all'esperto di tecnica seguente per la revisione di questo articolo:*Liam Cavanagh