在WPF应用程序中使用服务定位器模式时的视图范围模型

时间:2009-08-21 03:10:19

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

使用Service Locator类为要绑定的WPF页面提供ViewModel时。 ViewModels应该是Singleton作用域还是Factory作用域? WPF应用程序通常是一个更好的想法吗?

我知道在Silverlight中,Singleton更适合用户控件的页面,只能移入和移出前台。但是在尝试应用这种模式之前,我每次要加载时都会新建页面实例和各自的虚拟机。

我和我的同事已经完成了每个选项的所有优点和缺点,并且没有任何尖叫声,这对我们的场景来说是更好的选择。

感谢。

2 个答案:

答案 0 :(得分:2)

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

您可以使用RegionManager(CompositeWPF)之类的东西将View Models保存在内存中,直到它们被显式关闭。如果这是一项要求,这将允许用户通过打开视图来标记维护其交互。当用户决定保存/关闭屏幕时,它将从RegionManager中删除,然后进行垃圾收集。

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

答案 1 :(得分:0)

好吧,如果我退一步思考视图模型正在做什么;我为它分配了一个模型,然后我的视图使用命令或绑定属性。

因此,每个ViewModel都是特定于Model的实例。

ViewModel方法通常也适用于当前的模型实例。这意味着这些方法不是孤立的逻辑单元。即

interface IService
{
    Foo Model;
    Result DoSomethingWithModel();
}

具有依赖于其自身实例状态的逻辑。

虽然这是纯粹的逻辑服务:

interface IService
{
    Result DoSomething(With me);
}

在我看来,一个好的代码实践是在每个请求上注入一个新的ViewModel实例,即使你只有一个请求。