【问题标题】:Scope of View Models when using Service Locator Pattern in WPF app在 WPF 应用程序中使用服务定位器模式时的视图模型范围
【发布时间】:2010-11-21 13:10:00
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      好吧,如果我回过头来想想视图模型在做什么;我为它分配了一个模型,然后我让我的视图使用命令或绑定属性。

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

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

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

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

      而这是一个纯逻辑服务:

      interface IService
      {
          Result DoSomething(With me);
      }
      

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2013-10-12
      相关资源
      最近更新 更多