2014-06-10 58 views
3

我有一个处理发货数据的WPF mvvm应用程序,这包括将其分解为项目和形式代码等。全球数据真的那么糟糕?

但是,我现在面临的问题是需要了解众多的viewmodels,哪些项目目前已被选中,该形式等等,以及可以访问从数据库中提取的诸如项目之类的数据列表。

现在这个数据被加载,更新,删除和插入通过我称为存储库的类。比如ProjectRepository,我的计划是将加载的数据存储在这些类中,因此它将包含一个List(其中项目是我的模型),它将公开访问,而这些存储库是静态的。

所以问题归结到这一点,Proformas基于当前选定的项目(通过来自数据库的projectID)加载,因此存储库需要知道选择了哪个项目。我目前的系统使用了自定义事件,这些自定义事件也是为了捕获项目选择中的变化而订阅的,但是对于我来说,现在我有几十个事件,每个事件都有几十个订户,并且坦率地说,这使得它很难按照代码。

所以,对于大量的文本抱歉,我想说清楚我的情况是什么,并提出我所知道的问题似乎会使一些人感到愤怒。有一个静态类只是为所有当前选定的对象(项目,形式表示,装运等)保留属性有什么问题,这将使我的生活变得更容易。

或者有没有一种“正确”的方式做到这一点,我还没有看到?

+2

投票似乎有点超过顶部? – BenjaminPaul

+0

我一直问。正如“嗨,VMA,这是VMB。您对财产XYZ的当前价值是多少?” “富”。 “好的,当你Foo I Bar(),Kthxbai!”当然,VMA需要参考VMB,但是由于它们根据其逻辑需求彼此交互,这有什么坏处? – Will

+0

这实际上是我从未想过要做的事情。我想这种方法似乎没有错,除了一些虚拟机需要引用多个其他虚拟机,并且可能会变得混乱。 – Ben

回答

0

在桌面解决方案中,每个进程都是单用户使用,使用共享数据的静态类完全没有问题(对于很多情况,这是“正确”的方式),问题当一个进程用于为多个用户(例如网页)提供服务时就会出现这种情况,因为数据将在用户之间混合使用。

+0

啊,对不起,我应该提到,这只是一个桌面应用程序。 – Ben

+0

是的,我认为它,我只是把这句话来澄清什么时候使用静态数据是一个坏主意 – Gusman

0

全局状态的问题在于,它很难为应用程序编写单元测试。

解决问题的一种方法是测试更友好,那就是拥有一个工厂类,负责构造和返回给定视图模型的相应存储库。

1

我认为,如果您试图将全局静态对象用于可变数据,它通常会指向一个设计缺陷。

使用全局变量的中心问题是你失去了所有的封装。这意味着,随着应用程序规模的扩大,您无法将程序的某些部分作为组件进行考虑(或测试)。每个组件的每个实例都可能与其他每个组件进行交互,由全局静态对象调解。一旦你添加了线程和并发的组合,问题就复杂了。

我现在的系统使用的ViewModels为了捕捉在项目选择改变订阅自定义事件,但它似乎有点可笑,我认为我现在有几十项活动,每次几十用户,并坦率地说,它使得很难遵守代码。

我不相信这会让你的生活更轻松,即使在短期内。项目变更时,视图模型是否需要得到通知?否则,他们可能会显示或采取陈旧的数据。这听起来对我来说(无可否认,基于有限的信息),您应该尝试并简化用户更改项目时发生的事件链。

也许你可以丢掉视图并重新创建它们?或者,也许像“OnProjectChanged”一样将虚拟方法添加到基本视图模型中?或者,也许,如果视图模型实际上不需要得到有关更改的通知,只需将它们传递给Func<ProjectData>,以便他们可以在需要时懒惰地拉取当前数据。我不知道最好是什么,但必须有一个更好的解决方案,而不是引入全球统计数据并承担所有需要面对的难题。