适用于n层体系结构的良好.Net同步框架
对于一个项目,我需要更改服务器和客户端之间的通信 实际上,它是一个WCF服务,托管在控制台应用程序中,将整个表内容发送到客户端,客户端用新内容替换其所有本地缓存 客户机应用程序可以脱机工作(我们有一个区域设置缓存,它通过磁盘上的序列化而持久化,我们还有一个事务列表,它存储连接后必须发送到服务器的所有更改) 问题是,这种同步现在将发生在GSM连接上,发送整个表的内容实在是太重了 因此,要么我自己实现所有这些(设置修改日期、存储上次同步日期、仅获取更新字段、更新缓存),要么我可以找到一种标准方法来实现。我认为一个专门的图书馆会做得更好,因为他们已经考虑了很多我当然没有考虑过的场景 同步层的耦合度很低,所以改变它的工作方式并不是什么大问题 我的项目要求是:适用于n层体系结构的良好.Net同步框架,.net,wcf,entity-framework,synchronization,n-tier-architecture,.net,Wcf,Entity Framework,Synchronization,N Tier Architecture,对于一个项目,我需要更改服务器和客户端之间的通信 实际上,它是一个WCF服务,托管在控制台应用程序中,将整个表内容发送到客户端,客户端用新内容替换其所有本地缓存 客户机应用程序可以脱机工作(我们有一个区域设置缓存,它通过磁盘上的序列化而持久化,我们还有一个事务列表,它存储连接后必须发送到服务器的所有更改) 问题是,这种同步现在将发生在GSM连接上,发送整个表的内容实在是太重了 因此,要么我自己实现所有这些(设置修改日期、存储上次同步日期、仅获取更新字段、更新缓存),要么我可以找到一种标准方法来实
- 应该有增量同步
- 可以将更改推送到服务器
- 离线访问/存储信息
- 进行完全重新同步的可能性(损坏的缓存或新计算机)
- 服务器端的数据提供程序是实体框架
- 我需要重新使用当前的自定义身份验证
- 好处:某些类型有一个特殊的同步(例如,我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中)
你能建议我一些框架或库来做这项工作吗?或者您认为关于我的需求,我更应该自己实现这一点吗?取决于您可以或愿意部署和公开您可以使用的服务器的方式 在您担心应用程序时,复制可以解决所有繁琐的问题
可以考虑安装SQL Express并使用合并复制。
编辑 管理要复制和复制的数据。显然,微软没有为SQL Express提供引导程序,你看过这个吗过滤也没那么难,请参见:过去,我在一个类似的N层偶尔连接的客户端上使用了Microsoft Sync Framework,效果不错。自从我上次使用它以来,它一直在发展,但下面是我如何看到它满足您的要求 WCF 适用于WCF,这是我们使用它的方式。() 应具有增量同步 同步服务在这方面做得很好,但您可能需要向同步表中添加时间戳。您的客户机数据库(在我的示例中是SQL Server CE数据库)保存上次同步时使用的最后一个时间戳,然后它将使用该时间戳获取在下次同步期间随后更改的所有内容 可以将更改推送到服务器 我们又这样做了。服务器上有很多钩子提供自定义逻辑来验证数据 离线访问/存储信息 在完全断开连接的情况下工作正常(前提是用户已经首先同步了数据)。看 完全重新同步的可能性(损坏的缓存或新计算机) 它是保存所有同步信息的客户端数据库(如果需要,可以将有关客户端已同步的内容的知识放入服务器)。如果删除本地数据库,则客户端将执行完全同步 服务器端的数据提供程序是实体框架 这不是我使用它的方式,但是同步提供者是完全可定制的。我们打算做一个NHibernate,但是问问自己为什么要这样做。开箱即用同步服务将允许您使用存储过程或直接表查询推拉数据。这很容易设置,因为您可能会使用大量数据,所以运行速度非常快,而且跨WCF边界同步数据也很简单(尽管我们确实从xml格式化程序切换到二进制格式化程序以获得更好的性能) 我们所发现的只是因为我们在服务器上使用了实体,它们在客户端上不一定有意义,因此我们在客户端上有了一组全新的实体。这也意味着我们正在剥离存储过程中客户端不需要的数据。同样,这非常简单,您不需要使用ADO.net弄脏它。一旦数据在客户机上,我们就使用NHibernate读取和写入本地数据库 我需要重新使用当前的自定义身份验证 如果您是指WCF自定义身份验证,那么是的,因为我们有自己的WCF自定义安全令牌,它工作正常,没有任何影响 好处:某些类型具有特殊的同步功能(例如,我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中) 简短回答我不知道,因为他们是新框架中的文件同步提供程序,我没有使用过,但您还有两个其他选项
[OperationContract()]
SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
[OperationContract()]
SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
[OperationContract()]
SyncServerInfo GetServerInfo(SyncSession syncSession);