J4N*_*J4N 3 .net wcf synchronization entity-framework n-tier-architecture
对于项目,我需要更改服务器和客户端之间的通信.
实际上,它是一个托管在控制台应用程序中的WCF服务,它将整个表内容发送到客户端,客户端用新内容替换所有本地缓存.
客户端应用程序可以脱机工作(我们有一个语言环境缓存,它通过磁盘上的序列化持久化,我们还有一个事务列表,它存储了连接后我们必须发送给服务器的所有更改).
问题是这个同步现在将发生在GSM连接上,并且发送整个表内容真的很重.
所以要么我实现这一切(设置修改日期,存储最后的同步日期,只获取更新的字段,更新我的缓存),要么我找到一种标准的方法来做到这一点.我认为专用的图书馆会做得更好,因为他们已经考虑了很多我当然没有的情景.
同步层具有低耦合,因此改变它的工作方式并不是什么大问题.
我的项目要求是:
我看了一下,看看有什么存在.
我发现了一些关于Microsoft Sync Framework的东西,但它似乎非常面向ADO.Net,我不确定它是否可以从实体服务获取数据并将它们放入序列化缓存中.
所以:
你能告诉我一些框架或图书馆来完成这项工作吗?或者你认为关于我的需求,我应该自己实现吗?
我过去曾使用过Microsoft Sync Framework来为类似的N-Tier偶尔连接客户端而且它也很有用.自从我上次使用它以来,它一直在继续,但这里是我看到它如何满足您的要求.
WCF
在WCF上运行良好,这就是我们使用它的方式.(如何:配置N层同步)
应该有增量同步
同步服务可以很好地完成此操作,但您可能需要为同步表添加时间戳.您的客户端数据库(在我的情况下是一个SQL Server CE数据库)保存上次同步时使用的最后一个时间戳,然后它将使用它来获取在下次同步期间之后更改的所有内容.
可以将更改推送到服务器
我们再次这样做了.有很多钩子可以在服务器上提供自定义逻辑来验证数据.
离线访问/存储信息
在完全断开的情况下工作正常(假设用户已经先同步了他们的数据).请参阅脱机方案.
可以进行完全重新同步(损坏的缓存或新计算机)
客户端数据库保存所有同步信息(如果需要,您可以将知识发送到服务器上,了解客户端已同步的内容).如果删除本地数据库,则客户端将执行完全同步.
服务器端的数据提供程序是实体框架
这不是我使用它的方式,但同步提供程序是完全可定制的.我们打算看一下NHibernate,但问问自己为什么要这样做.开箱即用的Sync Services将允许您使用存储过程或直接表查询来推送和提取数据.这很容易设置,因为你可以使用大量数据,运行速度非常快,数据很容易在WCF边界同步(尽管我们确实从xml格式化器切换到二进制格式化程序以获得更好的性能).
我们发现的仅仅是因为我们在服务器上使用了实体,它们在客户端上并不一定有意义,因此我们在客户端上有一组全新的实体.这也意味着我们正在剥离存储过程中客户端不需要的数据.再次,这非常容易,你不需要弄脏ADO.net.然后,一旦数据在客户端上,我们就使用NHibernate来读取和写入本地数据库.
为Microsoft Sync Framework构建自定义同步提供程序
我需要重用我当前的自定义身份验证
如果你的意思是WCF自定义身份验证然后是,因为我们有自己的WCF自定义安全令牌,工作正常,没有任何影响.
奖励:某些类型有一个特殊的同步(例如我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中)
简短的回答我不知道,因为他们是新框架中的文件同步提供程序,我没有使用过,但你有两个其他的选择.
在客户端上进行同步期间,您实际上可以挂钩到将数据放入表中的位置,并且您有机会提取二进制数据并将其写入文件系统而不是数据库.
从同步中排除文件二进制数据,并在使用其他进程进行同步后将此数据拉下来.我们这样做是因为我们下拉的软件包非常大,所以我们使用初始同步来下拉"元数据",然后我们使用了一个名为BITS的东西,它是Windows的一部分,用于异步下拉文件.
Microsoft Sync Framework文件同步提供程序简介
[UPDATE]
回应评论中提出的问题.
我的应用程序应该适用于同一台计算机上的不同用户.在我的情况下,我使用隔离存储来保证它们在不同的位置工作,这是否可以使用SQL Server CE?
我们的应用程序是通过ClickOnce部署的,它可以为每个用户提供单独的应用程序安装,但我不认为这是被问到的.SQL CE只是一个内存数据库,您指向SqlCeEngine
要加载的数据库文件,因此隔离存储是完美的.
据我所知,SQL Server CE就像SQLite,你如何管理架构创建?
如果需要,您可以让Snyc Services为您创建数据库架构,这将足以让您前进,但从长远来看,您可能不得不在某些时候更改架构.这可能是你升级的时候,所以你最好早点考虑一下.我没有想到数据库属于同步服务,而是将同步服务告知它可以使用,从而解决了这个问题.
当我们的应用程序启动时,如果应用程序刚刚升级,它就像创建数据库(如果它不存在)或运行数据库脚本一样.
你知道这个N层同步的某个类实现的例子吗?我需要看看我要实现的接口.
目前的稳定版本是2.1,我正在使用它,因为2.0出来所以我的所有工作都在1.0.这是MSDN上Microsoft Sync Framework 2.1 api 的链接.我不得不使用1.0文档来查找我用来驱动我们的WCF接口的示例,所以我不知道事情发生了多大变化,但你可以使用它开始定义接口,如下所示:
[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);
Run Code Online (Sandbox Code Playgroud)
}
我想这是每种数据类型的一项服务?
不,正如您从上面所看到的,只有一项服务.什么是Synced取决于您在服务器上公开的内容以及客户端想要参与的内容.例如,我们有两个客户端,一个只对一小部分数据感兴趣,只参与同步几个表(称为a SyncTable
)其他同步所有表格的地方.
还有一个概念,它SyncGroup
包括相关的变化,这些变化应该是事务性的,因为它们都是相关的,即如果一个失败它们都会失败.您还可以单独同步组,而无需同步所有内容.
绝对.执行同步时,您传递的SyncParameter
值包含可用于过滤返回给客户端的数据的值.如何:过滤行和列.
归档时间: |
|
查看次数: |
3179 次 |
最近记录: |