c# - 在 WPF 应用程序中使用服务定位器模式时的 View 模型范围

标签 c# wpf design-patterns mvvm service-locator

使用 Service Locator 类为要绑定(bind)的 WPF 页面提供 ViewModel 时。 ViewModel 应该是单例范围还是工厂范围? WPF 应用程序通常是一个更好的主意吗?

我知道在 Silverlight 中,Singleton 更适合作为用户控件且仅在前台移入和移出的页面。但是在尝试应用这种模式之前,我一直在更新页面实例和它们各自的虚拟机,每次它们要被加载。

我和我的同事已经经历了每个选项的所有优点和缺点,没有什么是对我们的场景更好的选择。

谢谢。

最佳答案

我会远离让你的 View 模型单例。除非它们是在整个用户 session 的区域中持久保存的 View 。诸如导航或菜单等之类的东西。如果您使用 Prism/Composite WPF 他们利用 Unity 作为 IoC 或服务定位器(如果您使用它的话),则在呈现时创建 View 模型/演示模型并留给垃圾收集关闭时。这允许每个屏幕按预期经历其生命周期。

您可以使用 RegionManager (CompositeWPF) 之类的东西将 View 模型保存在内存中,直到它们被显式关闭。如果需要,这将允许用户通过打开的 View 来维护他们的交互。当用户决定保存/关闭屏幕时,它会从 RegionManager 中删除,然后被垃圾收集。

单例是用于非常特定目的的设计模式,即您只需要一个,并且在应用程序的生命周期中只需要一个。如果这不是要求,我会远离。

关于c# - 在 WPF 应用程序中使用服务定位器模式时的 View 模型范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1309920/

相关文章:

c# - 自定义命令不起作用

c# - Azure 服务总线 AutoDeleteOnIdle

wpf - 需要WPF工具包控件的主题(尤其是DataGrid)

c# - 如何替换文本中的字符颜色?

c# - 文件中数据段的重新排序

c# - 从禁用的文本框复制到剪贴板

wpf - 如何以编程方式导航 WPF UI 元素制表位?

oop - "composition over inheritance"只是意味着 "If parent class is never be used except in child class, it should be composition"吗?

design-patterns - 为什么在 SOA 设计中 CRUD 操作如此糟糕?

java - 对策略设计模式感到困惑