gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:05:39 28 4
gpt4 key购买 nike

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

实际上,这是一个WCF服务,驻留在控制台应用程序中,该服务将整个表的内容发送给客户端,并且客户端用新内容替换其所有本地缓存​​。

客户端应用程序可以脱机工作(我们有一个区域设置缓存,该缓存通过磁盘上的序列化保持不变,并且还有一个事务列表,该列表存储一旦连接就必须发送到服务器的所有更改)。

问题是这种同步现在将在GSM连接上发生,并且发送整个表的内容确实很繁琐。

因此,要么我自己实施所有操作(设置修改日期,存储上次同步日期,仅获取更新的字段,更新我的缓存),要么我可以找到一种标准的方式来做到这一点。我认为专用的图书馆会做得更好,因为他们已经想到了很多我当然没有想到的方案。

同步层耦合度低,因此改变其工作方式并不重要。

我的项目要求是:

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

  • 我环顾四周,看看有什么存在。

    我发现了一些有关Microsoft Sync Framework的信息,但似乎非常面向ADO.Net,并且我不确定它是否可以从实体服务中获取数据并将其放入序列化缓存中。

    所以:

    您可以建议我一些框架或库来完成这项工作吗?还是您认为就我的需求而言,我应该自己实施?

    最佳答案

    过去,我曾将Microsoft Sync Framework用于一个类似的N-Tier偶尔连接的客户端,并且可以正常工作。自从我上次使用它以来,它一直在发展,但是在这里,我看到它可以满足您的要求。

    WCF

    通过WCF可以正常工作,这就是我们使用它的方式。 (How to: Configure N-Tier Synchronization)

    应该具有增量同步

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

    可以将更改推送到服务器

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

    离线访问/存储信息

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

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

    客户端数据库包含所有同步信息(如果需要,您可以将有关客户端已同步内容的知识放到服务器上)。如果删除本地数据库,则客户端将进行完全同步。

    服务器端的数据提供者是Entity Framework

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

    我们发现的原因仅仅是因为我们在服务器上使用了实体,它们在客户端上不一定有意义,因此我们在客户端上有了一套全新的实体。这也意味着我们要删除存储过程中客户端不需要的数据。再次,这非常容易,您无需担心ADO.net。然后,一旦数据在客户端上,我们就使用NHibernate读取和写入本地数据库。

    Building Custom Sync Providers for the Microsoft Sync Framework

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

    如果您指的是WCF自定义身份验证,那么可以,因为我们拥有自己的WCF自定义安全令牌,该令牌工作正常,不会产生任何影响。

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

    简短答案我不知道,因为它们是新框架中的文件同步提供程序,我没有使用过,但是您还有另外两个选择。

  • 在客户端上进行同步期间,实际上您可以将数据放入表中,并且有机会提取二进制数据并将其写入文件系统而不是数据库。
  • 从同步中排除文件二进制数据,并在同步之后使用另一个进程将该数据拉低。我们这样做是因为要拉出的软件包很大,因此我们使用了初始同步来拉下“元数据”,然后我们使用了称为BITS的东西(它是Windows的一部分)来异步拉下文件。

  • Introduction to Microsoft Sync Framework File Synchronization Provider

    [更新]

    针对评论中提出的问题。
  • 我的应用程序应适用于同一台计算机上的不同用户。就我而言,我使用隔离存储来确保它们在不同的位置工作,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接口的示例,所以我不知道事情发生了多大的变化,但是您可以使用this来定义接口,如下所示:

    [服务合约]
    公共接口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);

  • 我想每种数据类型只有一项服务?

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

    还有一个 SyncGroup 的概念,这些包含相关的更改,因为它们都是相关的,因此应该以事务方式持久化,即,如果失败,则它们都将失败。您也可以单独同步组,而不必同步所有内容。
  • 我可以仅同步相对于用户的数据吗?

  • 绝对。进行同步时,您传递的 SyncParameter 包含可用于过滤返回给客户端的数据的值。 How to: Filter Rows and Columns

    关于.net - 适用于n层架构的良好.Net同步框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993786/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com