【问题标题】:Creation of View should be a part of View or ViewModel [MVVM]?View 的创建应该是 View 或 ViewModel [MVVM] 的一部分?
【发布时间】:2013-12-11 12:42:03
【问题描述】:

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

我们可以说:

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

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

而且我还看到大多数 MVVM 示例,用于命令绑定 conatins ViewModel 在执行某些命令时初始化另一个视图。这直接表明视图依赖于 ViewModel。

视图 --> ViewModel --> 模型

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

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

例子:

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

【问题讨论】:

  • MVC 和 MVVM 是解决同一问题的不同方法,但在其他方面无关。

标签: c# wpf mvvm


【解决方案1】:

“在 MVVM 中引入了 ViewModel,用于对代码进行单元测试。”

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

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

如果没有明智地选择类的职责,就会使测试更难编写,从而为开发人员正确设计类创造了更大的动力。但是,如果开发人员已经关心这一点,不管单元测试如何,它总是更好。

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

您甚至可以为单个模型拥有多个 ViewModel,为不同的 View 以不同的方式呈现数据。并且多个相似的 View 可能共享同一个 ViewModel,尽管这种关系通常是 1:1。

你说得对,ViewModel 一定不知道 View,Model 一定不知道 ViewModel。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2019-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多