具有依赖注入的MVVM ViewModels中的陈旧数据

Dan*_*rth 5 .net c# wpf dependency-injection mvvm

在我的WPF应用程序中,我使用MVVM模式和依赖注入.

从数据库准备数据的ViewModel获取注入构造函数的存储库.它们还使用构造函数中的存储库中的数据填充属性.

ViewModel都是在ViewModelLocator类的静态构造函数中创建的,所有View都使用它来绑定到它们的ViewModel.

这有以下缺点:

  1. 视图中的数据永远不会更新,即使在关闭和重新打开它们时也是如此,因为ViewModel实例始终是相同的.
  2. 打开第一个视图后,将实例化所有ViewModel,并从数据库中加载它们所需的数据.

我可以想出两种解决这些问题的方法:

  1. 使每个ViewModel实现一个从数据库读取数据并初始化属性的方法 - 而不是在构造函数中这样做.这将需要在每次打开视图时调用该方法.这引入了我不喜欢的时间耦合.
  2. 以这样的方式实现ViewModelLocator,即每次调用ViewModelLocator上的相应属性时,它都会创建所请求的ViewModel.我不喜欢这种方法,因为我的组合根不会在程序启动时执行,而是会在程序实例的整个生命周期内传播.

有没有其他方法可以解决这个问题?别人怎么解决这个问题?

Ree*_*sey 2

以这样的方式实现 ViewModelLocator:每次调用 ViewModelLocator 上的相应属性时,它都会创建所请求的 ViewModel。

这更多是我在这种情况下通常采取的方法。然而,我并没有通过 ViewModel 的 DI 来组合 ViewModelLocator,而是组合了创建 ViewModel 的工厂。

我不喜欢这种方法,因为我的组合根不会在程序启动时执行,而是会在程序实例的整个生命周期中传播。

通过让组合组成工厂而不是类型本身,这个问题至少部分得到“解决”。组合在启动时发生一次,但创建可以在相关 ViewModel 的任何时间发生。

例如,使用 MEF,您可以将导入切换为直接使用ExportFactory<T>而不是直接使用其类型。与NonShared Creation Policy一起,您可以根据需要构建 ViewModel,并始终使用新数据,而不会出现时间耦合问题。