ViewModel 和单例模式

Posted

技术标签:

【中文标题】ViewModel 和单例模式【英文标题】:ViewModel and Singleton Pattern 【发布时间】:2011-09-05 12:36:26 【问题描述】:

我有一个 ViewModel 用于枚举处理(实体框架中的实体很少)。

1) 从哲学上讲,对这个 ViewModel 使用 SINGLETON PATTERN 是一种好习惯吗,因为它在所有应用程序中都很普遍,并且在很多地方都有使用。

2) ViewModel(和关联的ObjectContext)存活很长时间不是问题吗?

谢谢!

【问题讨论】:

【参考方案1】:

在特定情况下,拥有单例 ViewModel 是完全有效的。我多次使用的一个示例是 SettingsViewModel。应用程序内的多个系统需要全局访问。创建时我的设置模型会从文件加载设置,ViewModel 允许我绑定以修改这些设置。单例允许我全局访问我需要的那些设置,而不是将它们作为参数传递。

在这种情况下完全有效。

【讨论】:

IMO,在您的描述中,听起来模型是单例,而不是 ViewModel。通常,视图模型是视图实例和模型实例之间的粘合剂。视图模型通常不会存储它所附加的视图之外的状态,它应该只控制功能。【参考方案2】:

1) 不要这样做。见MVVM ViewModels Singleton 2) 我认为将视图模型与对象上下文耦合不是一个好主意。它应该只是一个视图模型,为视图提供数据;但不与任何数据持久性技术紧密耦合。相反,注入处理此问题的服务,以便您可以模拟它们。

【讨论】:

【参考方案3】:

正如贾斯汀所说,您似乎不太可能需要您的 ViewModel 来遵循单例模式。但是,正如您所提到的,视图模型在整个系统中都使用。考虑将通用功能拉入基类(如果您喜欢继承)和/或将可重用组件拉入对象以利用组合。

一个简单的方法是 Josh Smith 的 ViewModelBase 的所有行和一个典型的 ViewModel 对 INotifyPropertyChanged 的​​使用。

在此处查看该代码:http://mvvmfoundation.codeplex.com/

【讨论】:

【参考方案4】:

只要垃圾收集器认为有必要,这些对象就只存在于堆栈中。从哲学上讲,不,使用 Singleton 不是一个好主意,因为它破坏了封装。见文章:Singleton antipattern

【讨论】:

一千个道歉,堆。 ***.com/questions/2129044/…【参考方案5】:

这可能应该分成两个单独的问题,但我会在这两个问题上尝试一下:

    没有。 ViewModel 没有理由应该是 Singleton。您实际上想要多个实例(因为每个实例都会有所不同),而不是为应用程序的运行而存在的单个实例。仅仅因为一个对象被广泛使用并且被频繁使用并不能使它成为一个很好的单例对象……它只是意味着它是一个很好的对象。

    ViewModel 不应该有很长的生命周期(另一个你不想要单例的原因)。在 MVVM 中,给定 ViewModel 的生命周期将与用户打开窗口并完成更改一样长。

【讨论】:

嗨贾斯汀,谢谢。一个问题...我有 3-4 个窗口,它们的内容需要同步。它需要一些努力来做到这一点。我想,如果我有一个 ViewModel 作为单例,这种模式会自动重新绑定几个 DataContexts... 单身人士不仅会被所有“窗口”共享,还会被所有用户共享——你真的想要吗? 在这四个窗口中仍然可以使用同一个实例,你不需要单例。 你需要一个会话范围的实例。 这取决于您的应用程序,它的结构如何?您是否使用多个模块,例如在 prism 中?你用注射吗?你如何创建视图和视图模型?通常,您可以创建视图模型的一个实例,并将每个窗口的数据上下文设置为该实例。但是您可以为每个窗口(Window1ViewModel、Window2ViewModel)创建不同的视图模型,并且每个窗口都有一个指向 CommonViewModel 的相同公共实例的属性。有很多可能性。

以上是关于ViewModel 和单例模式的主要内容,如果未能解决你的问题,请参考以下文章

PHP工厂模式和单例模式

静态类和单例模式区别

Dart中的类和单例模式

iOS 委托和单例模式

工厂模式和单例模式

构造方法私有化和单例模式