DTO = ViewModel?

aut*_*att 98 asp.net-mvc domain-driven-design dto viewmodel

我正在使用NHibernate来保存我的域对象.为了简单起见,我将ASP.NET MVC项目用作表示层和服务层.

我想从我的控制器类返回XML中的域对象.在Stack Overflow上阅读了一些帖子后,我收集DTO是可行的方法.但是,我也遇到过有关ViewModel的帖子.

我的问题:数据传输对象和ViewModels是一样的吗?或者ViewModel是DTO的一种子模式?

Dan*_*ger 95

DTO的规范定义是没有任何行为的对象的数据形状.

ViewModels是视图的模型.ViewModels通常是来自一个或多个对象(或DTO)的完整或部分数据,以及特定于视图行为的任何其他成员(可由视图执行的方法,指示如何切换视图元素的属性等).您可以将viewmodel视为视图和行为的所有数据.ViewModel可能会也可能不会将一对一映射到业务对象或DTO.

顺便说一句,如果某个视图模型需要来自持久化对象的数据子集,NHibernate 投影会派上用场.

  • 含义... DTO类通常仅包含属性,并且不包含具有业务逻辑等的任何方法... (2认同)

Ray*_*Ray 65

ASP.NET MVC实践中的ViewModel与DTO相同,但MVVM模式中的ViewModel与DTO不同,因为MVVM中的ViewModel具有行为但DTO没有.

  • +1用于区分ASP.NET MVC ViewModel和MVVM ViewModel. (7认同)
  • 这是一个很好的答案; 虽然细节不多. (4认同)
  • 为什么asp.net mvc中的ViewModel应该与DTO相同?这是没有意义的.ViewModel可以具有DTO的行为.这不依赖于mvc. (4认同)
  • @Elisa - 你的老问题的答案是,在ASP.NET MVC中,视图调用控制器上的Actions(而不是ViewModel),以便以无状态方式更改模型和视图.因此,形状为视图的DTO与ViewModel基本相同.但是,在具有另一个序列化边界的较大系统中,如果与专门为View构造的ViewModel分开,则DTO可能是有益的. (2认同)

sti*_*k81 28

DTO!= ViewModel

MVVM模式中,ViewModel用于将Model与View隔离.要表示模型,您可以使用简单的DTO类,它们再次通过例如NHibernate映射到数据库.但是我从来没有见过一个被建模为DTO的ViewModel类.ViewModel类主要有行为,而DTO没有.

  • 所以DTO可以只是结构(或者是一个应该模仿结构功能的类)? (2认同)

Dav*_*vid 20

DTO - 数据传输对象与其说的完全一样,是用于传输数据的容器.他们没有任何行为,只有一堆安装者和吸气剂.有些人使它们变得不可变,只需在需要时创建新的而不是更新现有的.它们应该是可序列化的,以允许通过电线传输.

通常,DTO用于跨越进程边界将数据从一个层传送到另一个层,因为对远程服务的调用可能很昂贵,因此所有需要的数据都被推送到DTO并以一个块(粗粒度)传输到客户端.

然而,有些人使用屏幕绑定DTO的概念(与交叉过程边界无关).同样,这些数据填充了所需的数据(通常是特定屏幕所需的数据,可能是来自各种来源的数据汇总)并发送给客户端.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

在已经说明的简单情况下,这个DTO可以用于绑定到视图,但在更复杂的情况下,它需要创建一个ViewModel并将数据从DTO卸载到ViewModel,这显然是更多的工作(当应用MVVM模式时) .

所以再次如已经说明的DTO!= ViewModel

DTO和ViewModel在生活中有不同的用途


ria*_*mri 12

首先,主要区别在于ViewModel可以拥有DTO必须不行的行为或方法!

其次,在ASP.NET MVC中使用DTO作为ViewModel使您的应用程序与DTO紧密耦合,这正是使用DTO的相反目的.如果你这样做,使用域模型或DTO的差异是什么,获得反模式会更复杂?

ASP.NET中的ViewModel也可以使用DataAnnotations进行验证.

相同的DTO可以具有不同的ViewModel Mapping,并且One ViewModel可以由不同的DTO组成(始终使用对象映射而不是合成).因为我认为如果你有一个包含DTO的ViewModel会更糟,我们会遇到同样的问题.

从您的表示层,将DTO视为合同,您将收到一个您必须认为对您的应用程序更陌生并且对其没有任何控制的对象(即使您有ex服务,dto和表示层是你的).

最后,如果您进行这种清洁分离,开发人员可以轻松地协同工作.设计ViewModels,Views和Controllers的人不必担心服务层或DTO实现,因为他将在其他开发人员完成实现时进行映射......他甚至可以使用Mocking工具或手动模拟来填充包含测试数据的表示层.


sgw*_*ill 9

对于一些简单的视图,我将使用我的DTO作为我的模型,但随着视图变得更加复杂,我将创建ViewModels.

对我来说,它是速度之间的平衡(使用DTO,因为我已经拥有它们)和灵活性(创建ViewModels意味着更多的关注点分离).

  • 很好的实用答案. (2认同)