实现MVVMC和依赖注入

时间:2012-10-10 12:52:22

标签: mvvm dependency-injection

我刚刚阅读了有关MVVMC模式的this文章。现在我有一个问题。是应该将Controller注入ViewModel,还是将ViewModel注入Controller?

4 个答案:

答案 0 :(得分:8)

MVVMC只是一个MVC,其中View被ViewModel对替换。

  • View仅与ViewModel交互,利用基于XAML技术的强大数据绑定机制。
  • ViewModel可以通知Controller,但不应该注入控制器。

我已根据MSDN上熟悉的Josh Smith样本汇总了一个简单的示例...我已经介绍了一个控制器。

答案 1 :(得分:5)

这取决于你在做什么。我猜想大多数时候Controller都不需要注入,但如果需要,它更有可能在ViewModel中需要。让我解释一下。

你在对控制器做什么?你必须做某事......如果那个“某事”只与“数据看起来像什么”有关,那么它就属于视图。如果它与“向用户显示的内容”相关,则它属于ViewModel。

我正在将一个控制器注入我的一个ViewModel中。我的ViewModel表示在View中绘制的数据。我有一个命令可以将数据项从当前图形移动到新图形。由于这会改变“图形窗口中显示的内容”,因此我在ViewModel中实现了该命令。 ViewModel从其自己的项集合中删除数据项,然后使用Controller请求为该新数据创建新视图(它已具有此功能)。

查看文章,我看不到控制器和视图之间的箭头 From the article you linked

答案 2 :(得分:0)

ViewModel是View和Controller之间的契约,理想情况下也不需要知道(依赖于)。

所以我绝对不会将Controller注入ViewModel。

我不确定我是否会做相反的事情:控制器通常负责创建新的ViewModel实例。如果你想要一个更松散耦合的实现,你可以将一个抽象工厂注入到Controller中,以避免直接创建ViewModel类的新实例。

答案 3 :(得分:0)

我相信Controller 应该作为抽象IController注入。 ViewModel需要IController才能导航到不同的View / ViewModel。

例如,在ViewModel中:

IController _controller;

public MyViewModel(IController controller){
  _controller = controller;
}

void NavigateHome();
{
  _controller.NavigateHome();
}

抽象IController比注入Controller本身更好:出于以下原因:

  1. 可测试性。您可以注入一个模拟IController并测试ViewModel
  2. 解耦。 ViewModel不必知道Controller。
  3. 我开发了一个用于在WPF中执行MVVMC的轻量级框架。 它与Asp.NET Core中的MVC有很多相似之处。

    如果您正在寻找WPF解决方案,请查看它。

    包含文档的博文: http://michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/

    GitHub的: https://github.com/michaelscodingspot/WPF_MVVMC