2

在我开始,我想说的是,我知道一个视图模型是什么,它的目的是什么,但这种情况下使得冗余..请在:)视图模型VS域实体

我正在阅读一个ASP.NET MVC4应用程序,并且遇到了关于PagedList,Domain Entities和ViewModels的一些头痛问题。

基本上,PagedList.MVC插件不能很好地与AutoMapper配合使用,而且我不得不做一些额外的工作来让它按照我的需要工作。

但是后来我想,当需要域实体的所有属性都需要时,我是否甚至需要一个ViewModel类?

当视图需要域实体上的每个属性时,ViewModel有哪些好处?

+0

愚蠢的问题,但你用什么来访问你的数据库?实体框架?如果是这样,Entity Framework支持可以直接映射到ViewModel的投影。 –

+1

当您的要求或域名实体发生变化,并且它们与您需要显示的内容不一样时,那么是什么? –

+0

@BigDaddy,这是一个很好的观点,但如果这是他需要展示的东西,那么它可以节省麻烦,福勒称之为鸟枪变异的气味。一个小的改变需要改变许多类。 – dove

回答

2

它可以是见仁见智的,我喜欢用视图模式(DTO的和),它提供了以下好处:

  • 我敢肯定,所有的视图所需要的数据被加载,而不是 代理等
  • 如果制作正确的DTO提供一个更小的图形在一个缓存来存储(可能并不适用于您的设置)
  • 它让我的视图模型从域对象有很大不同,他们往往是复合材料和是非常flatenned,并自由改变它们,而不影响我的应用程序的任何其他部分。

现在为了解决上述问题,许多人会直接使用您的域对象。如果您发现您的视图模型只是您的域名的一对一图片,并且您没有看到上述任何好处,我也可能会推荐这一点。

像往常一样,这取决于你的设置

  • 你的团队
  • 是什么让你生产
  • 工具使用ORM如果在所有
  • 规模和项目
  • 的时间
  • 经验
  • 使用
  • etc等
+0

所有的观点都是有效的,但在我的场景中,他们都是静音的。我想? – Ciwan

+0

是的,它听起来像你至少应该尝试工作,如果它只是在你的方式,我已经添加了一个“它取决于”的答案 – dove

+0

我最近在一个小团队与开发人员拥有15年以上的经验。我们的域名和虚拟机中有90%是1对1关系。是的,它创建了一个额外的foreach语句来转换这两个,但我喜欢分离。任何支持的想法/为什么这样的1对1传输完成的原因 – CSharper

1

我只想补充说,对于小型项目,只需拥有自己的ViewModel并使用它即可。稍后,您可以在实体需要时分开实体。

对于许多开发者增加新图层而没有权衡利弊,后来他们开始注意到滞后疑惑发生。 MVC本身已经是一个分离关注点。

拥有独立的DomainEntity解决了UI不再将1对1映射到实体的问题,请考虑以下事项。

Version 1 
Domain    | Presentation 
-------------------------------- 
User.FirstName  | User.Name 
User.LastName  | 
User.PositionTitle | User.PositionTitle 

该示例演示了域和演示文稿不再以1对1映射。在未来,你可能有域的修改,如下列:

Version 2 
Domain    | Presentation 
-------------------------------- 
User.FirstName  | User.Name 
User.LastName  | 
Position.Title  | User.PositionTitle 

基于上面的例子(第2版),请注意,呈现没有被修改。拥有分离的域模型可以提高界面的稳定性。它甚至可以降低重构场景的更改成本。

优势的视图模型

视图模型的美妙之处在于它能够消除您的域名从表示,在大型项目中,不同的开发商处理系统的不同部分使用时,这样的好处是更明显(独立GUI团队)

一个小小的变化需要更改许多类。

这是解耦您的实体的缺点之一,它会创建代码的重复。额外的编码具有巨大的成本,其益处显而易见是值得的。

相关问题