全球数据真的那么糟糕吗?

时间:2014-06-10 15:17:51

标签: c# wpf mvvm global-variables

我有一个处理货件数据的WPF mvvm应用程序,包括将其分解为项目和形式等。

然而,我现在面临的是,需要知道多个视图模型,当前选择哪个项目,哪些形式等等,以及可以访问诸如Projects之类的数据列表已从数据库中提取。

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

因此问题归结为此,Proformas基于当前选定的项目(通过DB中的projectID)加载,因此存储库需要知道选择了哪个项目。我当前的系统使用自定义事件,其中视图模型也按顺序订阅以捕获项目选择中的更改,但是对我来说,我现在有几十个事件,每个事件都有几十个订阅者,这似乎有点荒谬,坦率地说,这使得它很难按照代码。

所以,对不起大量的文字,我想说清楚我的情况是什么,并且问我认识的问题似乎让一些人感到愤怒。如果有一个静态类只包含所有当前所选对象(项目,形式,出货等)的属性,那么这将使我的生活变得更加容易。

还是有#34;对"这样做的方式,我还没见过?

3 个答案:

答案 0 :(得分:1)

我认为,如果您想将全局静态对象用于可变数据,通常会指出设计缺陷。

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

  

我当前的系统使用视图模型订阅的自定义事件以捕获项目选择中的更改,但是对我来说,现在我有几十个事件,每个事件都有几十个订阅者,这显得有些荒谬,坦白说它遵循代码非常困难。

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

也许你可以抛弃视图并重新创建它们?或者可以在基础视图模型中添加一个虚拟方法,如“OnProjectChanged”?或者,如果视图模型实际上不需要通知更改,只需将它们传递给Func<ProjectData>,以便他们可以在需要时懒洋洋地拉取当前数据。我不知道什么是最好的,但必须有一个更好的解决方案,而不是引入全球静态并承担所有令人头疼的问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

对您的问题更友好的一种方法是拥有一个工厂类,负责为给定的视图模型构建和返回适当的存储库。