理解MVVM中的分离

时间:2016-12-11 17:01:12

标签: c# wpf mvvm dependency-injection factory-pattern

我最近一直在学习很多关于MVVM的知识,但还没有掌握一切 - 我最大的问题是:

  

什么是合格的,哪些不符合总体模型视图ViewModel分离,以及如何查看" border"?

我会尝试根据我现在正在进行的项目来讨论我的问题。

1。案例

我们假设我们有一个带有大量按钮的MainWindow,每个按钮都会打开一个特定的按钮。新窗口。

注意:对于DI我使用IoC容器(Castle Windsor)。

MainWindow有自己的ViewModel,它还有自己的Model。我们的Io​​C容器在应用启动时初始化它。

我们还有一个TypedFactory(或任何其他工厂),我们想要创建其他MVVM对象。

现在,重要的一部分:当我们按下按钮时,我们想要一个新窗口打开。如果它不是MVVM,那么可以(不应该)在ViewModel本身中调用窗口创建,只需执行以下操作:

WindowX ourNewWindow = new WindowX();
ourNewWindow.Show();

但是,这是MVVM,我们应该严格避免在ViewModel中引用我们的View。因此,我们可以将创建过程委托给我们的工厂。

我们可以通过将Factory注入我们的ViewModel构造函数并告诉Factory为我们创建View来实现。

private IFactory _factory;
public ViewModel(IFactory factory)
{
    _factory = factory;
}

public void OpenWindow()
{
    var newWindow = _factory.Create<NewView>();
    newWindow.Show();
}

尽管如此,这对我来说并不合适(如果我错了,请纠正我),因为我们仍然在ViewModel中引用我们的新视图。

因此,我们可以添加另一层间接,无论是WindowMnager。让windowManager将IFactory作为依赖项,并将窗口创建和管理的所有进程委托给它。

但是,对我来说,仍然觉得View和ViewModel之间没有链接,不应该存在。或者我完全错了并且错误地接近案件了?

因此,最后一个问题是:

  

这是什么时候提到的&#34;链接&#34; Vie和ViewModel之间的关系消失了,我们何时停止创建越来越多的间接级别?

2 个答案:

答案 0 :(得分:2)

  

尽管如此,这对我来说并不合适(如果我错了,请纠正我),因为我们仍然在ViewModel中引用我们的新视图。

不,视图模型实际上对窗口一无所知。它只知道工厂接口(或“窗口服务”接口或您选择调用它的任何东西)。实际创建窗口的是此接口的实现,您可以轻松地将该实现替换为另一个,而不会影响视图模型。

这是依赖注入的美丽。这里重要的是视图模型只依赖于接口,因此视图模型和视图之间没有直接耦合。实现接口的类可以例如在视图特定项目/程序集中轻松定义,接口本身和视图模型可以在视图模型项目/程序集中实现,单元单独测试,而不实际创建任何窗口。

答案 1 :(得分:0)

我接近它的方式:

  • 从MainViewModel发送消息
  • 在该消息中注册了一个处理器,用于处理窗口的打开。

这样,触发的实际过程就会与行动分开。