我刚刚阅读了这篇关于 MVMC 模式的文章。现在我有一个问题。Controller应该注入ViewModel,还是ViewModel应该注入Controller?
4 回答
MVMC 只是一个 MVC,其中 View 被 ViewModel 对替换。
- View 仅与 ViewModel 交互,利用基于 XAML 的技术中强大的数据绑定机制。
- ViewModel 可以通知控制器,但绝不应该注入控制器。
我根据 MSDN 上众所周知的 Josh Smith 示例整理了一个简单的示例……我在其中介绍了一个控制器。
这取决于你在做什么。我猜测大多数时候控制器都不需要注入其中,但如果需要,则更有可能在 ViewModel 中需要它。让我解释。
你用控制器做什么?您必须在做某事。如果该“某事”仅与“数据的样子”相关,那么它属于视图。如果它与“正在向用户显示的内容”相关,那么它属于 ViewModel。
我将一个控制器注入到我的一个 ViewModel 中。我的 ViewModel 表示数据,然后在视图中绘制图形。我有一个命令将数据项从当前图表移动到新图表。由于这改变了“图形窗口中显示的内容”,我在 ViewModel 中实现了该命令。ViewModel 从它自己的项目集合中移除数据项,然后使用控制器请求为该新数据创建一个新视图(它已经具有此功能)。
查看文章,我没有看到控制器和视图之间的箭头
ViewModel 是 View 和 Controller 之间的契约,理想情况下也不需要知道(依赖)。
所以我绝对不会将控制器注入到 ViewModel 中。
我也不确定我是否会做相反的事情:控制器通常负责创建新的 ViewModel 实例。如果你想要一个更松耦合的实现,你可以将一个抽象工厂注入到 Controller 中,以避免直接创建 ViewModel 类的新实例。
我认为 Controller应该作为抽象 IController 注入。ViewModel 需要 IController 才能导航到不同的 View/ViewModel。
例如,在 ViewModel 中:
IController _controller;
public MyViewModel(IController controller){
_controller = controller;
}
void NavigateHome();
{
_controller.NavigateHome();
}
由于以下原因,抽象 IController 比注入 Controller 本身要好:
- 可测试性。您可以注入一个模拟 IController 并测试 ViewModel
- 脱钩。ViewModel 不必知道 Controller。
我开发了一个轻量级框架,用于在 WPF 中执行 MVMC。它与 Asp.NET Core 中的 MVC 有很多相似之处。
如果您正在寻找 WPF 解决方案,请查看它。
带有文档的博客文章:http: //michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/