我在过去读过一些关于模型的MVC建议,说明你不应该为域和视图重用相同的模型对象; 但我一直没能找到任何人愿意讨论为什么这是不好的.
我认为创建两个独立的模型 - 一个用于域,一个用于视图 - 然后在它们之间进行映射会产生大量重复,加上繁琐的映射代码(其中一些可能会被像AutoMapper这样的东西减轻)很可能容易出错.
是什么让这两个问题的单独模型值得重复和映射代码的麻烦?
从本质上讲,两个模型是关于分离关注点.我希望我的View可以使用单个模型.我希望我的域模型能够代表我使用领域专家构建的概念模型.ViewModel经常有技术限制.域模型是关于POCO的,并且不受显示(查看)或持久(在数据库中或其他方面)的数据的技术约束的约束.
假设我在屏幕上显示了三个实体.这是否意味着我需要强迫三者之间的关系?或者只创建一个包含所有三个项目的ViewModel组件对象.使用单独的ViewModel,View关注点与我的域名分开.
为什么?'因为视图不应该具有使用模型对象的能力!
想象一下,您将项目传递给Web设计人员来执行视图层.突然之间,他/她有能力通过模型层来处理应用程序的数据.这不好.
因此,始终只传递视图所需的数据,而不是传递方法的对象.
JP Boodhoo的文章Screen Bound DTO将帮助您了解设计优势.
还有一个安全的好处,我已经写了.
使用演示模型可以简化您的视图.这一点尤其重要,因为视图通常很难测试.通过使用表示模型,您可以将大量工作移出视图并进入域 - >表示模型.格式化,处理空值和展平对象图等事情.
我同意额外的映射很痛苦,但我认为你可能需要在特定的环境中尝试这两种方法,看看什么最适合你.