DTO = ViewModel?

时间:2009-12-30 19:42:43

标签: asp.net-mvc domain-driven-design viewmodel dto

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

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

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

9 个答案:

答案 0 :(得分:91)

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

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

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

答案 1 :(得分:61)

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

答案 2 :(得分:28)

  

DTO!= ViewModel

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

答案 3 :(得分: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在生活中有不同的用途

答案 4 :(得分:12)

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

其次,在ASP.NET MVC中使用DTO作为ViewModel使您的应用程序与DTO紧密耦合,这与使用DTO完全相反。如果您这样做,使用您的域模型或DTO有什么区别,获得反模式会更复杂?

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

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

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

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

答案 5 :(得分:8)

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

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

答案 6 :(得分:0)

如果您将DTO用作ViewModel,这意味着您正在高度依赖DTO,因为您正在更改DTO,然后它可能会影响ViewModel。

更好地使用DTO&转换为viewmodel。

答案 7 :(得分:0)

我们可以使用与Model类相同的 DTO ,并且当我们需要在单个视图中显示/使用多个模型数据/属性时,可以使用viewmodel。示例:我首先使用实体​​框架数据库创建一些模型。因此,现在所有模型都基于数据库生成。现在我们需要数据注释,对于这些数据注释,我们可以创建一个文件夹名称DTO,在此DTO文件夹中,我们可以使所有已经生成的模型保持准确,并在属性上方添加数据注释。然后,我们可以使用此DTO类使用任何操作(使用controller,views)。当我们需要复杂的视图时,我的意思是当我们在一个视图中需要多个类数据时,可以使用viewmodel。对于viewmodel,我们可以创建一个文件夹名称viewmodel,然后创建一个自定义类并保留我们需要的属性。我试图清除自己。任何建议高度赞赏。

答案 8 :(得分:0)

如果您需要更改或增强 DTO,请创建一个 ViewModel。 ViewModel 也可以将 DTO 作为复杂属性引用。

在实践中,您通常希望将特定于视图的属性或方法添加到您在视图中使用的模型中。在这种情况下, 永远不要根据您的视图要求修改 DTO。相反,创建一个 ViewModel 并从您的 DTO 映射到 ViewModel。