在行動裝置、分散式系統與邊緣運算普及的今天,資料同步已成為企業級應用的核心需求。Microsoft Sync Framework 提供協議無關、存儲無關的同步平台,支援資料庫、檔案系統、Feed 等多種資料源。本文從核心架構切入,手把手教你建立自訂同步提供者,實現雙向、增量、衝突可控的資料同步。
框架由四大組件構成:
以 WPF 應用同步兩個資料夾為例,核心步驟如下:
Microsoft.Synchronization、Microsoft.Synchronization.Files 組件。FileSyncProvider 封裝來源/目標資料夾,指定唯一 ReplicaId(GUID)並持久化避免重複生成。SyncOrchestrator,設定 LocalProvider/RemoteProvider 與 Direction(雙向/單向)。Synchronize() 執行同步,透過 SyncOperationStatistics 獲取統計資訊。var sourceProvider = new FileSyncProvider(sourceReplicaId, sourcePath);
var destProvider = new FileSyncProvider(destReplicaId, destPath);
var orchestrator = new SyncOrchestrator {
LocalProvider = sourceProvider,
RemoteProvider = destProvider,
Direction = SyncDirectionOrder.DownloadAndUpload
};
var stats = orchestrator.Synchronize();
Console.WriteLine($"上傳: {stats.UploadChangesApplied}, 下載: {stats.DownloadChangesApplied}");
使用 FileSyncScopeFilter 排除特定檔案:
var filter = new FileSyncScopeFilter();
filter.FileNameExcludes.Add("*.tmp");
filter.FileNameExcludes.Add("Thumbs.db");
var provider = new FileSyncProvider(replicaId, path, filter, FileSyncOptions.None);
訂閱 ApplyingChange 事件,在 AppliedChangeEventArgs 中設定 SkipChange = true 可跳過單筆變更。啟用 PreviewMode 可先掃描變更清單再決定是否執行。
ConflictResolutionPolicy 提供四種模式:
當內建提供者無法滿足需求(如專有資料庫、REST API、NoSQL),繼承 KnowledgeSyncProvider 並實作 IChangeDataRetriever、INotifyingChangeApplierTarget 即可。核心流程:
BeginSession:初始化連線、載入中繼資料。GetSyncBatchParameters:目標端回傳知識與批次大小。GetChangeBatch:來源端根據目標知識產生變更批次。ProcessChangeBatch:目標端應用變更、偵測衝突。SaveItemChange / StoreKnowledgeForScope:持久化資料與知識。EndSession:釋放資源。範例:同步三個 SQL Server 資料庫的 Student 表。自訂提供者內部使用 ADO.NET 執行 CRUD,利用 SyncKnowledge 追蹤版本,實現多主同步。
filesync.metadata,生產環境建議集中存放資料庫,避免檔案鎖定與備份困擾。FileSyncProvider 實作 IDisposable,同步結束必須 Dispose() 釋放非託管資源。Sync Framework 以可擴展的提供者模型,統一了異構資料源的同步邏輯。掌握其核心協調流程與自訂提供者開發,即可為離線優先、多端協作、邊緣計算等場景構建可靠的同步骨幹。下一步可探索 SqlSyncProvider 的資料庫同步進階功能,或整合至 ASP.NET Core 微服務中實現跨區域資料最終一致性。