我在过去读过一些关于模型的MVC建议,说明你不应该为域和视图重用相同的模型对象; 但我一直没能找到任何人愿意讨论为什么这是不好的.
我认为创建两个独立的模型 - 一个用于域,一个用于视图 - 然后在它们之间进行映射会产生大量重复,加上繁琐的映射代码(其中一些可能会被像AutoMapper这样的东西减轻)很可能容易出错.
是什么让这两个问题的单独模型值得重复和映射代码的麻烦?
我知道将域模型用作视图模型可能会很糟糕.如果我的域模型有一个名为IsAdmin的属性并且我有一个Create控制器操作来创建用户,那么即使我没有在我的视图中公开这样的文本字段,也有人可以改变我的表单并使其发布一个IsAdmin = true表单值. .如果我正在使用模型绑定,那么当我提交我的域模型时,该人现在将成为管理员.因此,解决方案只是在视图模型中公开我需要的属性,并使用AutoMapper之类的工具将我返回的视图模型对象的属性值映射到我的域模型对象的属性值.但是我读到类上的bind属性可以用来指示Model Binder它应该和不应该绑定哪些属性.那么究竟是什么原因使得两个独立的类(领域模型和视图模型)必须代表相同的东西,然后在映射它们时增加开销呢?这是一个代码组织问题,如果是这样,我如何受益?
编辑
我遇到的与域模型分离的视图模型的最重要原因之一是需要实现MVVM模式(基于Martin Fowler的PM模式)来管理复杂的UI.