2012-06-12 60 views
3

对于一个项目,我需要更改服务器和客户端之间的通信。适用于n层架构的良好.Net同步框架

实际上,它是一个WCF服务,托管在控制台应用程序中,将整个表内容发送到客户端,客户端用新内容替换其所有本地缓存​​。我们有一个语言环境高速缓存,它通过磁盘上的序列化持久化,并且我们还有一个事务列表,它存储了连接后我们必须发送给服务器的所有更改)。

问题是,现在这个同步会发生在GSM连接上,并且发送整个表格的内容真的很重。

所以要么我实现自己所有这些(设置修改日期,存储最后一个同步日期,只获取更新字段,更新我的缓存),要么我可以找到一个标准的方式来做到这一点。我认为专门的图书馆会做得更好,因为他们已经想到了很多我没有的场景。

同步层的耦合度很低,所以改变它的工作方式并不是什么大不了的事。

我的项目的要求是:

  • 应该有增量同步
  • 可以推动更改服务器
  • 访问/店铺信息离线
  • 可能性做一个全面的重新同步(损坏缓存,或新的计算机)
  • 在服务器端的数据提供程序是实体框架
  • 我需要重新使用我目前的自定义身份验证
  • 奖励:某些类型具有特殊的同步(例如,我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中)

我看了一下,看看有什么存在。

我发现有关Microsoft同步框架的一些东西,但它似乎很ADO.Net导向,我不知道它能够从一个实体服务中获取数据,并把它们放在一个序列化的高速缓存。

所以:

你能告诉我一些框架或库来完成这项工作?或者你认为关于我的需求,我应该自己实施这个吗?

回答

7

我已经使用微软同步框架,在过去的一个类似的N层偶尔连接的客户端和它的工作一种享受。自从我上次使用它以来,它一直在发展,但这里是我如何看到它满足您的要求。

WCF

正常工作了WCF,这是我们如何使用它。 (How to: Configure N-Tier Synchronization

应该有增量同步

同步服务,做到这一点非常好,但你可能需要时间戳添加到您的同步表。您的客户端数据库(在我的情况下是SQL Server CE数据库)包含上次同步时使用的最后一个时间戳,然后它将使用此数据库获取在下次同步期间之后更改的所有内容。

可以推动改变

我们再次这样做的服务器。有很多钩子在服务器上提供定制逻辑来验证数据。在完全断开的情况

访问/存储信息的脱机

工作正常(提供用户已经第一同步他们的数据)。见Offline Scenarios

可能性做一个全面的重新同步(损坏缓存,或新的电脑)

它是保存所有的同步信息(你可以把知识到什么客户端已同步,如果客户端与服务器数据库你想要)。如果删除本地数据库,则客户端将执行完全同步。

在服务器端的数据提供程序是实体框架

这不是如何我都用过,但同步商是完全可定制。我们将看看做一个NHibernate的人,但问问自己为什么你想这样做。开箱即用的Sync Services将允许您使用存储过程或直接表查询推送和提取数据。这非常容易设置,因为您可以使用大量数据,所以运行速度非常快,并且数据很容易跨WCF边界进行同步(尽管我们切换到xml格式化程序的二进制格式化程序以获得更好的性能)。

我们发现仅仅是因为我们在服务器上使用实体时,它们并不一定对客户端有意义,因此我们在客户端拥有一组全新的实体。这也意味着我们在存储过程中剥离了客户端中不需要的数据。再次,这是非常容易的,你不需要弄脏ADO.net。然后,一旦数据在客户端上,我们使用NHibernate读取和写入本地数据库。

Building Custom Sync Providers for the Microsoft Sync Framework

我需要重新使用我目前的自定义验证

如果你的意思是WCF自定义身份验证,然后是因为我们有它无任何影响工作的罚款我们自己的WCF定制的安全令牌。

奖励:某些类型有一个特殊的同步(例如,我已经包含小文件的数据库,但在客户端,文件必须直接在文件夹中放)

简短的回答我不知道知道他们是我没有使用过的新框架中的文件同步提供程序,但您有两个其他选项。

  1. 在你其实可以挂接到其中的数据将被放入表点客户端上的同步,你有机会拉二进制数据,并将其写入文件系统,而不是数据库。

  2. 从同步中排除文件二进制数据,并在使用另一个进程进行同步后拉下此数据。我们这样做是因为我们下拉的软件包非常大,所以我们使用初始同步来下拉“元数据”,然后我们使用了一个名为BITS的窗口的一部分来异步下拉文件。

Introduction to Microsoft Sync Framework File Synchronization Provider

[UPDATE]

响应于评价提出的问题。

  1. 我的应用程序应该适用于同一台计算机上的不同用户。就我而言,我使用隔离存储来保证它们在不同的位置工作,SQL Server CE可以实现这种情况吗?

    我们的应用程序是通过ClickOnce部署的,它将为每个用户提供单独的应用程序安装,但我不认为这是被问到的。 SQL CE只是一个内存数据库,您将SqlCeEngine指向要加载的数据库文件,因此隔离存储是完美的。

  2. 据我所知,SQL Server CE就像SQLite,你如何管理模式创建?

    如果您愿意,您可以让Snyc Services为您创建数据库架构,这将足以让您走,但从长远来看,您可能不得不在某些时候更改架构。这可能会在你升级时让你更早地考虑它。我通过不考虑数据库属于同步服务来解决这个问题,但是同步服务被告知可以使用它。

    当我们的应用程序启动时,它做了一些维护,如创建数据库(如果它不存在)或者如果应用程序刚刚升级,则运行数据库脚本。

  3. 您是否知道是否有某个地方提供了此N层同步的类实现示例?我需要看看我要实现的接口。

    目前的稳定版本是2.1,我正在使用它,就像2.0出来一样,所以我所有的工作都在1.0。以下是MSDN上Microsoft Sync Framework 2.1 api的链接。我不得不使用1.0文档来找到我用来驱动WCF界面的例子,所以我不知道事情有多大变化,但是您可以使用this开始,它将界面定义为:

    [ServiceContract] public interface IServiceForSync {OperationContract()] SyncContext ApplyChanges(SyncGroupMetadata groupMetadata,DataSet dataSet,SyncSession syncSession);

    [OperationContract()] 
    SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession); 
    
    [OperationContract()] 
    SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession); 
    
    [OperationContract()] 
    SyncServerInfo GetServerInfo(SyncSession syncSession); 
    

    }

  4. 我想这是每个数据类型的服务?

不,您可以从上面看到只有一项服务。什么是Synced取决于你在服务器上公开的内容以及客户端想要参与的内容。例如,我们有两个客户端,一个只对一小部分数据感兴趣,并且只参与同步一对表(称为一个SyncTable)与其他同步的所有表格。

还有一个SyncGroup的概念,它们由相关的变化组成,这些变化应该在事务上保持不变,因为它们都是相关的,即,如果一个失败,它们都会失败。您还可以单独同步这些组而无需同步所有内容。

  1. 我可以只同步相对于用户的数据吗?

绝对如此。当您进行同步时,您会传递一个包含值的SyncParameter,您可以使用这些值来过滤返回给客户端的数据。 How to: Filter Rows and Columns

+0

你的建议似乎很有趣,我有几个问题:1.我的应用程序应该适用于同一台计算机上的不同用户。在我的情况下,我使用隔离存储来保证它们在不同的位置工作,使用SQL CE可以这么做吗? 2.据了解,SQL CE就像SQLite,你如何管理模式创建? 3.你知道这个N层同步是否有类实现的例子吗?我需要看看我要实现的接口。 4.我想这是每种数据类型的一项服务? 5.我可以仅同步用户的数据吗? – J4N

+0

@ J4N我已更新答案以解决您提出的其他问题。 – Bronumski

+0

我试图实现你的解决方案,我有一个问题:你如何管理删除?如果一个元素被删除,你怎么知道当客户调用GetChanges操作?您是否将所有数据都标记为已删除?或者你有一个包含所有已删除元素的表格? – J4N

0

取决于你能方式还是愿意部署和揭露你可以使用SQL Server Replication

复制,而你不用担心应用程序可以采取一切繁琐replication tasks照顾服务器。

你可能会考虑安装SQL Express和使用合并复制。

编辑 Using parameterized filters管理什么数据将被复制和installing SQL Express as a prerequisite using a bootstrapper。显然微软并没有提供SQL Express的引导程序here is a discussion on a that

+0

我已经想过了。但用户只能访问数据库的部分副本(并且我需要通过一个安装程序安装客户端上的所有内容) – J4N

+0

安装SQL Express可以通过添加它作为安装应用程序的先决条件来完成。据我所知,您可以指定过滤器来确定将推送什么数据。 –

+0

嗯,它开始很有趣。所以你说我可以在安装程序中完成SQL Express的安装和配置?而对于过滤器,我有一些疑虑,我可以根据当前用户设置它们。 – J4N