MVC:数据模型和视图模型
我已经阅读过一些关于模型的MVCbuild议,指出不应该为域和视图重用相同的模型对象; 但是我还没有find任何人愿意讨论为什么这是坏的。
我认为创build两个单独的模型 – 一个用于域,一个用于视图 – 然后在它们之间映射会产生大量的重复,再加上繁琐的映射代码(其中一些可能通过诸如AutoMapper之类的缓解)容易出错。
是什么使得为这两个问题build立一个单独的模型值得重复和映射代码的麻烦?
其核心,两个模式是关于分离的关注。 我希望我的View可以使用单个模型。 我希望我的领域模型能够代表我与领域专家一起构build的概念模型。 ViewModel通常有技术上的限制。 领域模型是关于POCO的,不受任何数据显示(视图)或持久性(以数据库或其他方式)的技术限制。
假设我在屏幕上显示了三个实体。 这是否意味着我需要强制三者之间的关系? 或者只是创build一个包含所有三个项目的ViewModel组件对象。 使用独立的ViewModel,查看问题与我的域分离。
为什么? 因为视图不应该具有使用模型对象的能力!
想象一下,你把项目传递给一个网页devise师做视图层。 突然间,他/她有能力通过模型层来处理应用程序的数据。 这不好。
所以总是只传递视图需要的数据,而不是带有方法的对象。
JP Boodhoo的文章Screen Bound DTOs将帮助你理解devise的好处。
我已经写了一些安全方面的好处 。
有一个演示模型简化了你的观点。 这一点尤其重要,因为意见通常很难testing。 通过使用演示模型,可以将大量工作从视图中移到域 – >演示模型中。 像格式化,处理空值和展平对象图。
我同意额外的映射是一个痛苦,但我认为你可能需要在你的具体情况下尝试两种方法,看看什么最适合你。
甚至还有一些问题,包括视图模型能够被特殊格式化,并且肯定是无效的。
我想这个想法是,你的领域模型可能扩展到其他的实现,而不仅仅是你的MVC应用程序,这将打破关注的分离原则。 如果您的视图模型是您的域模型,那么您的域模型有两个原因需要更改:域更改要求和视图要求更改。
似乎我也有重复的规则。
即。 在UI上进行客户端对象validation,然后映射到必须validation的域对象。
然而,我倾向于做的是映射我的域对象集来创build一个模型 – 即。 显示客户信息,股票信息等的网页…我的模型成为一个持有Customer对象和Stock对象的结构。
CompanyPageModel
公共客户客户{get;} public Stock股票{get;}
然后在我的MVC项目ViewData.Model.Customer.Name ViewData.Model.Stock.CurrentStocks
分离“看起来像更多的工作,但后来,有这种UI /领域模型的划分是不错的,就像写testing:)
最后,我已经喝醉了,我喜欢能够用显示指示标记我的viewmodel,并且把所有的汽车都连接起来。
我现在要求的是某种来自poco实体的视图模型的自动生成器。 我总是将一些string设置为一个int,并且需要我永远find它。 除非你喜欢痛苦,否则不要想象没有使用automapper。