我有一个ViewModel
用于枚举处理(实体框架中的实体很少)。
1)从哲学角度来说,为这个ViewModel使用SINGLETON PATTERN是一个好习惯,因为它在所有应用程序中都很普遍,而且它在许多地方使用。
2)ViewModel(和关联的ObjectContext
)长时间存在不是问题吗?
谢谢!
答案 0 :(得分:7)
这可能应该分解为两个单独的问题,但我会对两个问题进行一次尝试:
没有。 ViewModel没有理由应该是Singleton。实际上,您需要多个实例(因为每个实例都会发生变化)而不是为应用程序运行而生存的单个实例。仅仅因为一个对象很普遍并经常使用它并不能使它成为单身人士的好选择......它只是意味着它是一个好的对象。
ViewModels不应该有很长的生命周期(另一个原因是你不需要单例)。在MVVM中,给定ViewModel的生命周期与用户打开窗口并完成更改一样长。
答案 1 :(得分:2)
拥有单例ViewModel在特定情况下完全有效。我多次使用的一个例子是SettingsViewModel。需要在应用程序内的多个系统全局访问。创建时我的设置模型从文件中加载设置,ViewModel允许我绑定以修改这些设置。单例允许我全局访问我需要的设置,而不是将它们作为参数传递。
完全有效,在这种情况下。
答案 2 :(得分:0)
只要垃圾收集器认为对象是必要的,对象就只能存在于堆栈中。从哲学上讲,使用Singleton不是一个好主意,因为它打破了封装。请参阅文章:Singleton antipattern
答案 3 :(得分:0)
正如Justin所说,你似乎不太可能需要你的ViewModel来遵循Singleton模式。但是,正如您所提到的,View Models在整个系统中使用。考虑将常用功能拉入基类(如果您喜欢继承)和/或将可重用组件拉入对象以利用组合。
开始这个的简单方法是Josh Smith的ViewModelBase的所有行和典型的ViewModel对INotifyPropertyChanged的使用。
答案 4 :(得分:0)
1)不要这样做。见MVVM ViewModels Singleton 2)我认为将视图模型耦合到对象上下文并不是一个好主意。它应该只是一个viewmodel,为视图提供数据;但没有与任何数据持久技术紧密耦合。相反,注入处理此问题的服务,以便您可以模拟它们。