代码之家  ›  专栏  ›  技术社区  ›  Konstantin Spirin

我应该在容器中注册视图模型吗?

  •  5
  • Konstantin Spirin  · 技术社区  · 15 年前

    好处:

    1. 当视图模型被激活时,我可以执行一些操作
    2. 容器将为我注入依赖项
    3. ???

    缺点:

    1. ViewModel生命周期管理可能很棘手:
      • 如果将ViewModel设为singleton,则无法实例化同一类型的多个控件
      • 如果我将ViewModel设置为transient,那么当我实际希望注入同一个实例时,很容易会出现多个不同实例的情况

    正确答案是什么?

    如果重要的话,我用的是Caliburn和Autofac。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Bryan Watts    15 年前

    容器是由它创建的对象所居住的生态系统。景观模型与这些居民互动,因此也是生态系统的一部分。为了准确地反映这种关系,您应该在容器中注册视图模型。

    InstancePerDependency 有视图模型。视图模型表示特定UI的状态和行为-它是控件的非特定于框架的模拟。正如通常不能在UI树的两个位置放置同一个控件实例一样,也不能重用同一个视图模型实例。

    如果可以,我们称之为 ViewsModel

        2
  •  4
  •   Peter Lillevold Rene    15 年前

    2)的好处足以让容器处理viewmodels。我们使用自己的MVVM框架,其中视图实例和视图模型实例之间有严格的一对一关系。因此,这些缺点是不存在的。

    除此之外,是否还有其他情况需要在多个视图之间共享一个viewmodel实例?

        3
  •  0
  •   aqwert    15 年前

    不确定autofac或Caliburn(可能仍然适用),但当它到达Unity容器时,我将只注册ViewModel,如果。。。

    集装箱处理完后我需要把它处理掉。您可以创建一个生存期管理器来存储新创建的(非单例)视图模型实例。

    container.RegisterType<MyViewModel>(new DisposeableInstanceLifetimeManager());
    ...
    container.Resolve<MyViewModel>();  // here all dependencies will get injected
    ...
    container.Dispose(); 
    

    var child = container.CreateChildContainer();
    child.RegisterInstance(model, new ContainerControlledLifetimeManager());
    child.Resolve<MyViewModel1>();
    child.Resolve<MyViewModel2>(); // both can share the model instance
    

    (注意:对于Unity,在使用 Resolve 在ViewModel上,即使它没有注册到容器)。

    否则,除非您需要一个单独的ViewModel(尽管我想不出什么时候会有用),否则我觉得将ViewModel添加到容器中只是添加了更多的代码,没有任何好处。

    推荐文章