保持存储库与多个客户端同步

时间:2014-01-20 19:14:17

标签: wpf entity-framework

我有一个使用实体框架的WPF应用程序。我将实现一个存储库模式,以使与EF的交互变得简单且更易于测试。多个客户端可以使用此应用程序并连接到同一数据库并执行CRUD操作。我试图想办法在对数据库进行更改时同步客户端存储库。任何人都可以就如何解决这类问题给出一些指导,以及一些可能对这类问题有利的模式吗?

我会对任何有关如何保持客户端同步的信息/书籍持开放态度,甚至会对其他客户正在做的事情发出警报(我唯一能想到的是运行服务器进程以传递消息)。谢谢

1 个答案:

答案 0 :(得分:1)

到目前为止,让每个客户端UI保持最新的最简单方法就是简单地每隔一段时间刷新一次数据。如果真的那么重要,那么当您可以获得正在显示的最新数据时,您可以设置DispatcherTimer每分钟打勾。

显然,我并不是建议您刷新正在编辑的项目,但如果您获得了新数据,您当然可以将馆藏与当前显示的项目进行比较。您可以更加用户友好,只需添加新的项目,删除已删除的项目并更新新项目,而不是仅使用新项目替换旧的集合项目。

您甚至可以检测当前用户是否已保存当前编辑的项目,因为当前用户打开了该项目并提醒他们注意事实。因此,您应该努力检测两组数据之间的变化,然后将其无缝集成到当前的UI状态,而不是专注于某个系统来跟踪所有数据更改。


更新>>>

在您的应用程序(或存储库)中保存一组完整的数据绝对没有任何好处。实际上,由于额外的RAM要求,您可能会发现它会增加不利影响。如果您每隔几分钟轮询一次数据,那么无论如何它总是最新的。

因此,不是一直询问所有数据,只是询问用户想要查看的内容(取决于他们当前所处的视图)并不时地更新它。我通过简单地获取视图首次打开时所需的相同数据来实现此目的。我写了一些方法,将每个项目的每个属性与UI中的旧对应项进行比较,然后将其换成新的。

想想Equals方法......你可以这样做:

public override bool Equals(Release otherRelease)
{
    return base.Equals(otherRelease) && Title == otherRelease.Title && 
        Artist.Equals(otherRelease.Artist) && Artists.Equals(otherRelease.Artists);
}

(实际上不要使用Equals方法,否则以后会遇到问题)。然后是这样的事情:

if (!oldRelease.Equals(newRelease)) oldRelease.UpdatePropertyValues(newRelease);

和/或者这个:

if (!oldReleases.Contains(newRelease) oldReleases.Add(newRelease);

我猜你现在得到的照片。