【发布时间】:2011-09-05 12:36:26
【问题描述】:
我有一个 ViewModel 用于枚举处理(实体框架中的实体很少)。
1) 从哲学上讲,对这个 ViewModel 使用 SINGLETON PATTERN 是一种好习惯吗,因为它在所有应用程序中都很普遍,并且在很多地方都有使用。
2) ViewModel(和关联的ObjectContext)存活很长时间不是问题吗?
谢谢!
【问题讨论】:
标签: c# .net entity-framework mvvm
我有一个 ViewModel 用于枚举处理(实体框架中的实体很少)。
1) 从哲学上讲,对这个 ViewModel 使用 SINGLETON PATTERN 是一种好习惯吗,因为它在所有应用程序中都很普遍,并且在很多地方都有使用。
2) ViewModel(和关联的ObjectContext)存活很长时间不是问题吗?
谢谢!
【问题讨论】:
标签: c# .net entity-framework mvvm
在特定情况下,拥有单例 ViewModel 是完全有效的。我多次使用的一个示例是 SettingsViewModel。应用程序内的多个系统需要全局访问。创建时我的设置模型会从文件加载设置,ViewModel 允许我绑定以修改这些设置。单例允许我全局访问我需要的那些设置,而不是将它们作为参数传递。
在这种情况下完全有效。
【讨论】:
1) 不要这样做。见MVVM ViewModels Singleton 2) 我认为将视图模型与对象上下文耦合不是一个好主意。它应该只是一个视图模型,为视图提供数据;但不与任何数据持久性技术紧密耦合。相反,注入处理此问题的服务,以便您可以模拟它们。
【讨论】:
正如贾斯汀所说,您似乎不太可能需要您的 ViewModel 来遵循单例模式。但是,正如您所提到的,视图模型在整个系统中都使用。考虑将通用功能拉入基类(如果您喜欢继承)和/或将可重用组件拉入对象以利用组合。
一个简单的方法是 Josh Smith 的 ViewModelBase 的所有行和一个典型的 ViewModel 对 INotifyPropertyChanged 的使用。
在此处查看该代码:http://mvvmfoundation.codeplex.com/
【讨论】:
只要垃圾收集器认为有必要,这些对象就只存在于堆栈中。从哲学上讲,不,使用 Singleton 不是一个好主意,因为它破坏了封装。见文章:Singleton antipattern
【讨论】:
这可能应该分成两个单独的问题,但我会在这两个问题上尝试一下:
没有。 ViewModel 没有理由应该是 Singleton。您实际上想要多个实例(因为每个实例都会有所不同),而不是为应用程序的运行而存在的单个实例。仅仅因为一个对象被广泛使用并且被频繁使用并不能使它成为一个很好的单例对象……它只是意味着它是一个很好的对象。
ViewModel 不应该有很长的生命周期(另一个你不想要单例的原因)。在 MVVM 中,给定 ViewModel 的生命周期将与用户打开窗口并完成更改一样长。
【讨论】: