MVC:数据模型和视图模型

Posted

技术标签:

【中文标题】MVC:数据模型和视图模型【英文标题】:MVC: Data Models and View Models 【发布时间】:2010-10-03 06:32:46 【问题描述】:

我过去读过一些关于模型的 MVC 建议,指出您不应该为域和视图重用相同的模型对象;但我找不到任何愿意讨论为什么这很糟糕的人。

我认为创建两个单独的模型 - 一个用于域,一个用于视图 - 然后在它们之间进行映射会产生大量重复,加上繁琐的映射代码(其中一些可能会通过 @987654321 之类的东西得到缓解@) 这很可能容易出错。

是什么让为这两个关注点建立一个单独的模型值得重复和映射代码的麻烦?

【问题讨论】:

【参考方案1】:

两个模型的核心是关注点分离。我希望我的视图可以使用单个模型。我希望我的领域模型能够代表我与领域专家建立的概念模型。 ViewModel 通常有技术限制。域模型是关于 POCO 的,不受显示(视图)或持久化数据(在数据库中或其他方式)的技术约束。

假设我在屏幕上显示了三个实体。这是否意味着我需要强制三者之间建立关系?或者只是创建一个包含所有三个项目的 ViewModel 组件对象。使用单独的 ViewModel,视图关注点与我的域分离。

【讨论】:

谢谢 - 欢迎来到 S.O. =P 当我在你的博客上留下评论时,我不知道你还没有注册! 域模型与视图模型混合是否合理?因此,即视图模型对象包含一些域模型对象(不是相反!)s.a. ***.com/questions/3094633/… @JimmyBogard ViewModel 用于我的视图,域模型用于我的应用程序逻辑,“数据模型”是否适合我的数据库映射?我将如何将域模型映射到我的数据模型并持久化?【参考方案2】:

为什么?因为视图不应该有使用模型对象的能力!

假设您将项目传递给网页设计师来制作视图层。突然间,他/她有能力通过模型层处理您的应用程序数据。这不好。

所以总是只传递视图需要的数据,而不是带有方法的对象。

【讨论】:

【参考方案3】:

J.P. Boodhoo 的文章Screen Bound DTOs 将帮助您了解设计的好处。

还有一个我写过的security benefit。

拥有一个演示模型可以简化您的视图。这一点尤其重要,因为视图通常很难测试。通过拥有一个表示模型,您可以将大量工作移出视图并进入域->表示模型。诸如格式化、处理空值和展平对象图之类的事情。

我同意额外的映射是一种痛苦,但我认为您可能需要在您的特定环境中尝试这两种方法,看看哪种方法最适合您。

【讨论】:

【参考方案4】:

还有一些更明显的问题,包括视图模型的特殊格式化能力和 null 安全性。

【讨论】:

【参考方案5】:

我想这个想法是您的域模型可能会扩展到其他实现,而不仅仅是您的 MVC 应用程序,这会破坏关注点分离原则。如果您的视图模型是您的域模型,那么您的域模型有两个更改原因:域更改要求和视图要求更改。

【讨论】:

【参考方案6】:

看来我也有重复的规则。

即。 UI 上的客户端对象验证,然后映射到必须验证的域对象。

然而,我倾向于做的是映射我的域对象集以创建模型 - 即。一个显示客户信息、库存信息等的网页……我的模型变成了一个包含 Customer 对象和 Stock 对象的结构。

公司页面模型

公共客户客户get; 公开股票 get;

然后在我的 mvc 项目中 ViewData.Model.Customer.Name ViewData.Model.Stock.CurrentStocks

分离“似乎”需要更多的工作,但后来,对 UI/Domain 模型进行这种划分是件好事……有点像编写测试 :)

【讨论】:

【参考方案7】:

我终于喝醉了,我确实喜欢用显示指令标记我的视图模型,并让所有这些都自动连接。

我现在需要的是某种来自 poco 实体的视图模型的自动生成器。我总是将一些字符串设置为 int 并且我需要很长时间才能找到它。除非您喜欢痛苦,否则不要考虑在没有自动映射器的情况下执行此操作。

【讨论】:

以上是关于MVC:数据模型和视图模型的主要内容,如果未能解决你的问题,请参考以下文章

APS.NET MVC + EF (06)---模型

MVC模式

MVC模式

菜鸟笔记:MVC 模式

设计模式MVC模式

ASP.NET MVC – 模型简介