寻找多客户端存储库模式框架

时间:2016-07-30 08:16:53

标签: entity repository-pattern

我正在使用存储库模式(使用基于MongoDB的基础持久性)将数据延迟加载到我在C#/ .NET客户端应用程序中定义的POCO中。

这些POCO实现INotifyPropertyChanged / INotifyCollectionChanged,并用作MVVM客户端应用程序的“模型”层。我使用WPF数据绑定绑定到客户端UI中的集合和属性,并希望使用数据绑定仅加载客户端当前感兴趣的数据。我想使用INotifyPropertyChanged / INotifyCollectionChanged来通知UI数据库中实体的任何更改。

当我只有一个客户端连接到数据库时执行此操作非常简单。我不必处理多个客户端同时在其UI中编辑相同数据的情况。

但是,我确实想要处理多个客户端。因此,我需要一些方法来同步每个客户端的实体,因为每个客户端都会对数据库进行更改并提交。

这听起来像多个潜在解决方案的问题,尤其是:

  1. 每个客户端都可以通过存储库定期轮询数据库,查找他们当前感兴趣的实体。客户端将新获取的实体与客户端上的当前实体进行比较,并相应地添加/删除/更新。

    • 好的是每个客户端都有自己的连接,通过存储库直接连接到数据库。无需任何形式的中介服务。
    • 这种方法的问题在于它需要从数据库定期向客户端发送大量数据,并且在高负载下可能无法扩展。
  2. 存在某种事件驱动机制,其中实体模型中的任何属性更改或集合更改将事件发送到中央服务。此服务将从所有客户端接收的所有更改排入队列,使用这些更改更新数据库,并将事件传输到所有已连接的客户端。这需要在数据库之上的某种中央消息排队服务。

    • 这种方法的好处是只需要将更改发送到客户端,因此可以扩展到高数据负载的情况。
    • 此方法的问题在于您需要设置邮件路由系统,例如使用WCF来管理通知客户端他们感兴趣的数据实体的变化。
  3. 每个实体都存储“上次更新时间”。客户定期轮询,仅询问自上次投票以来已更新的项目。

    • 这种方法的好处在于,您只需要在每次轮询时从数据库中获取更改的数据,而不是解决方案1中的所有数据。
    • 这种方法的问题在于客户端将在下次轮询之前保持最新状态,并且当一个客户端改变“赢”而不是另一个客户端时,您可能会遇到意外的碰撞效应,从而使丢失其更改的客户感到困惑。
  4. 我确信这是一个相当古老的问题,有许多优雅的候选人可以解决它。

    其中一个激励因素是我希望将我的存储库实体用作MVVM应用程序的数据模型层。

    是否有人知道此问题的预先存在的解决方案或最佳实践经验?

0 个答案:

没有答案