全球数据真的很糟糕

本文关键字:真的 数据 | 更新日期: 2023-09-27 18:08:12

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

然而,我现在面临的是,需要知道在众多的视图模型,哪个项目是当前选择的,哪种形式等,以及有权限访问的数据列表,如项目已从数据库中拉出来。

现在这个数据被加载,更新,删除和插入通过类我已经调用存储库的。例如projectrerepository,我的计划是将加载的数据也存储在这些类中,因此它将包含一个可以公开访问的List(其中project是我的模型),并且这些Repository是静态的。

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

所以,很抱歉有这么多文字,我想说清楚我的情况是什么,并问一个我知道似乎会激怒一些人的问题。有一个静态类,它只是保存所有当前选择的对象(项目,形式,装运等)的属性,这有什么错呢?这将使我的生活明显更容易。

或者是否有一种"正确"的方法,我还没有见过?

全球数据真的很糟糕

我认为,如果您试图为可变数据使用全局静态对象,这通常指向设计缺陷。

使用全局变量的核心问题是你失去了所有的封装。这意味着,随着应用程序规模的增长,不可能将程序的某些部分作为组件来考虑(或测试)。每个组件的每个实例都可能通过全局静态对象进行交互。一旦您将线程和并发性添加到混合中,问题就变得复杂了。

我当前的系统使用视图模型订阅的自定义事件来捕获项目选择中的更改,但是我现在有几十个事件,每个事件都有几十个订阅者,这对我来说似乎有点荒谬,坦率地说,这使得很难遵循代码。

我不相信这会让你的生活更轻松,即使是在短期内。当项目更改时,视图模型不需要得到通知吗?否则,它们可能会显示或操作过时的数据。在我看来(基于有限的信息),您应该尝试简化用户更改项目时发生的事件链。

也许你可以把视图扔掉,重新创建它们?或者添加一个虚拟方法到你的基本视图模型,如"OnProjectChanged"?或者,如果视图模型实际上不需要收到更改的通知,只需向它们传递一个Func<ProjectData>,以便它们可以在需要时惰性地提取当前数据。我不知道什么是最好的,但肯定有比引入全局静态和承担所有这些带来的头痛更好的解决方案。

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

全局状态的问题是,它使为应用程序编写单元测试变得困难。

解决问题的一种更适合测试的方法是使用一个工厂类,它负责为给定的视图模型构造和返回适当的存储库。