创建View应该是View或ViewModel [MVVM]的一部分?

时间:2013-12-11 12:42:04

标签: c# wpf mvvm

* 在MVVM *中添加VM的主要目的

我们可以说:

  1. ViewModel是在MVVM中引入的,用于单元测试代码 如果我们比较 MVC和MVVM MVC 单元测试控制器很难没有View。
    所以我们又添加了一层 ViewModel 来测试主要代码。

  2. 管理模型不存在的一些非持久数据。 引入ViewModel来管理一些非持久化数据,并根据用户输入将数据保存到数据库中模型。 验证模型中的数据更改并按照命令保留 管理数据绑定。

  3. 我也看到大多数MVVM样本用于命令绑定conatins ViewModel 在执行某些命令时初始化另一个View。这直接表明视图依赖于ViewModel。

      

    查看 - > ViewModel - >型号

    ViewModel 应该是一个独立的可测试单元。

    从视图#1初始化视图#2应该是视图#1代码隐藏文件的一部分。

    示例:

    如果我想调用MessageBox(视图#2)。 应在视图#1中调用消息框并基于消息框结果(是\否) 要执行操作,我们应该在ViewModel#1中调用适当的方法。这个 ViewModel 将独立于视图,我们可以轻松编写单元测试。

1 个答案:

答案 0 :(得分:4)

“ViewModel是在MVVM中引入的,用于单元测试代码。”

不完全是。正确解耦的代码很容易测试。但这是好设计的好处,而不是原因。代码被解耦并拆分成较小的单元,因为可以理解较小的单元,而不能完全理解由50'000行代码组成的单个上帝对象类。

我们将代码分解为具有小且有限接口的独立部分,以便可以孤立地查看问题,并且对一个类的更改不会在整个系统中产生连锁反应。作为副作用,零件变得足够简单,可以通过单元测试进行全面测试。

如果不明智地选择类的职责,那么强迫开发人员编写单元测试可以让开发人员更好地激励设计正确的类,使测试更难写。但是,无论单元测试如何,如果开发人员已经关心这一点总是更好。

返回ViewModel。模型是数据。 ViewModel是可呈现格式的数据。对于一个简单的一次性程序,它们可能是相同的,但通常模型中的数据有一些约束,例如必须是可序列化的,或者是从其他地方提供的。 ViewModel更改数据的格式。

您甚至可以为单个模型使用多个ViewModel,以不同的方式为不同的视图显示数据。并且多个相似的视图可以共享相同的ViewModel,尽管这种关系通常是1:1。

您是正确的,ViewModel必须不知道View,而模型必须不知道ViewModel。