6

我在网上读到使用“厨房水槽”模型是不好的做法:

规则#3——视图决定了视图模型的设计。只有渲染视图所需的内容才会通过 ViewModel 传入。

如果一个 Customer 对象有 50 个属性,但一个组件只显示它们的名称,那么我们创建一个只有这两个属性的自定义 ViewModel 类型。

然而,Jimmy Bogard 随后对这有多好的解释给我留下了一些疑问。让我的模型只包含客户列表非常容易,我什至可以使用我的 POCO。

那么现在我可以为网站上的每个页面创建自定义的小视图模型片段了吗?使用 Customer 属性的每个页面都会得到一个,但当然不能共享,因为某些信息是无关的,例如,如果一个页面使用 Age 而不是 Name。两个新的迷你视图模型类对吗?

这非常耗时,并且似乎会导致一百万个小自定义视图模型 - 有人可以详细说明这种方法的实用性以及为什么更简单的方法不好?

4

3 回答 3

3

视图模型类不仅可以用于传递值,还可以定义数据类型(数据注释)、验证规则和与模型中使用的不同的关系。我现在想到的一些优点:

  • 当您更改用户密码、更改其基本数据或订阅设置时,有不同的验证规则。在一个模型类中定义所有这些规则可能很复杂。当使用不同的视图模型时,它看起来更好更干净。
  • 使用视图模型还可以为您带来性能优势。如果要显示用户列表,可以仅使用 id 和名称定义视图模型,并使用索引从数据库中检索它。如果您检索了整个对象并将其传递给视图,那么您从数据库中传输的数据将超出您的需要。
  • 您可以为视图模型定义显示和编辑器模板,并使用 html 帮助器在不同页面上重用它们。当您为模型 POCO 定义模板时,它看起来更糟。
于 2012-04-25T14:35:09.220 回答
2

如果您将 POCO 对象用作视图模型,那么您实际上将显示您的私有对象并破坏封装。这反过来又会使您的模型很难在不更改相应视图的情况下进行更改。

您的数据对象可能包含仅适用于数据访问层的详细信息。如果您将这些东西暴露给视图,那么有人可能会更改您没想到会更改的那些值并导致错误。

许多与在 OO 语言中拥有私有成员相同的原因都适用于这种推理。话虽如此,它仍然经常被破坏,因为创建所有这些“一次性”模型需要大量额外的工作,而这些模型只能使用一次。存在用于创建这类模型的框架,尽管我不知道名称,它可以将对象联系在一起并挑选出有趣的属性,从而消除创建特定视图模型的一些苦差事。

于 2012-04-25T14:18:03.933 回答
0

您的视图模型告诉视图应如何显示数据。它表达了模型。我认为没有必要有两个视图模型,除非你有两种方法来表达你的模型。仅仅因为你有两个页面,并不意味着你将以任何不同的方式显示数据,所以当它可以在一个可重用的视图模型中时,我不会浪费时间制作两个迷你视图模型,想象一下如果以后你有一个页面需要姓名和年龄,您会创建另一个视图模型吗?这绝对是愚蠢的。但是,如果您有两个页面都显示“年龄”并且需要以不同的方式显示,那么我会创建另一个页面。

于 2012-04-25T15:35:57.873 回答