适用于n层架构的良好.Net同步框架

时间:2012-06-12 09:24:21

标签: .net wcf entity-framework synchronization n-tier-architecture

对于项目,我需要更改服务器和客户端之间的通信。

实际上,它是一个托管在控制台应用程序中的WCF服务,它将整个表内容发送到客户端,客户端用新内容替换所有本地缓存​​。

客户端应用程序可以脱机工作(我们有一个语言环境缓存,它通过磁盘上的序列化持久化,我们还有一个事务列表,它存储了连接后我们必须发送给服务器的所有更改。)

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

所以要么我实现这一切(设置修改日期,存储最后的同步日期,只获取更新的字段,更新我的缓存),要么我找到一种标准的方法来做到这一点。我认为一个专用的图书馆会做得更好,因为他们已经考虑了很多我当然没有的情景。

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

我的项目要求是:

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

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

我发现了一些关于Microsoft Sync Framework的内容,但它看起来非常面向ADO.Net,我不确定它是否可以从实体服务获取数据并将它们放入序列化缓存中。

所以:

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

3 个答案:

答案 0 :(得分:7)

我过去曾使用Microsoft Sync Framework为类似的N-Tier偶尔连接的客户端而且它也很有用。自从我上次使用它以来,它一直在继续前进,但这就是我如何看待它满足您的要求。

<强> WCF

在WCF上运行良好,这就是我们使用它的方式。 (How to: Configure N-Tier Synchronization

应具有增量同步

同步服务可以很好地完成此操作,但您可能需要在同步表中添加时间戳。您的客户端数据库(在我的情况下是SQL Server CE数据库)保存您上次同步时使用的最后一个时间戳,然后它将使用它来获取在下次同步期间之后更改的所有内容。

可以将更改推送到服务器

我们再次这样做了。有很多钩子可以在服务器上提供自定义逻辑来验证数据。

离线访问/存储信息

在完全断开的情况下正常工作(假设用户已经先同步了他们的数据)。请参阅Offline Scenarios

可以执行完全重新同步(损坏的缓存或新计算机)

客户端数据库保存所有同步信息(如果您愿意,可以将知识发送到服务器上,了解客户端已同步的内容)。如果删除本地数据库,则客户端将执行完全同步。

服务器端的数据提供者是实体框架

这不是我使用它的方式,但同步提供程序是完全可自定义的。我们打算看一下NHibernate,但问问自己为什么要这样做。开箱即用的Sync Services将允许您使用存储过程或直接表查询来推送和提取数据。这很容易设置,因为你可以使用大量数据,运行速度非常快,数据很容易在WCF边界同步(尽管我们确实从xml格式化器切换到二进制格式化程序以获得更好的性能)。

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

Building Custom Sync Providers for the Microsoft Sync Framework

我需要重复使用当前的自定义身份验证

如果您的意思是WCF自定义身份验证,那么是的,因为我们拥有自己的WCF自定义安全令牌,该令牌在没有任何影响的情况下正常工作。

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

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

  1. 在客户端上进行同步期间,您实际上可以挂钩到将数据放入表中的位置,并且您有机会提取二进制数据并将其写入文件系统而不是数据库。

  2. 从同步中排除文件二进制数据,并在使用其他进程进行同步后将此数据拉下来。我们这样做是因为我们提取的软件包非常大,所以我们使用初始同步来下拉元数据&#34;然后我们使用了一个名为BITS的东西,它是Windows的一部分,用于异步下拉文件。

  3. 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] 公共接口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. 我认为每种数据类型都有一项服务?

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

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

      1. 我只能同步与用户相关的数据吗?
      2. 绝对。执行同步时,您传递SyncParameter,其中包含可用于过滤返回给客户端的数据的值。 How to: Filter Rows and Columns

答案 1 :(得分:0)

根据您可以或愿意部署和公开服务器的方式,您可以使用SQL Server Replication

当您担心应用程序时,复制可以处理所有繁琐的replication tasks

您可以考虑安装SQL Express并使用合并复制。

修改 Using parameterized filters管理要复制的数据和installing SQL Express as a prerequisite using a bootstrapper。显然,Microsoft没有为SQL Express here is a discussion on a that

提供引导程序

答案 2 :(得分:0)