Asp.net mvc DTO=视图模型?

Asp.net mvc DTO=视图模型?,asp.net-mvc,domain-driven-design,viewmodel,dto,Asp.net Mvc,Domain Driven Design,Viewmodel,Dto,我正在使用NHibernate来持久化我的域对象。 为了简单起见,我使用ASP.NETMVC项目作为表示层和服务层 我想从控制器类返回XML格式的域对象。在阅读了一些关于堆栈溢出的帖子后,我认为DTO是一种解决方法。然而,我也遇到过一些关于ViewModel的帖子 我的问题:数据传输对象和视图模型是一样的吗?或者ViewModel是DTO的一种子模式?对于一些简单的视图,我将使用DTO作为模型,但随着视图变得更加复杂,我将创建ViewModels 对我来说,这是快速性(使用DTO,因为我已经有了

我正在使用NHibernate来持久化我的域对象。 为了简单起见,我使用ASP.NETMVC项目作为表示层和服务层

我想从控制器类返回XML格式的域对象。在阅读了一些关于堆栈溢出的帖子后,我认为DTO是一种解决方法。然而,我也遇到过一些关于ViewModel的帖子


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

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


对我来说,这是快速性(使用DTO,因为我已经有了DTO)和灵活性(创建视图模型意味着更多的关注点分离)之间的平衡。

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

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

顺便说一句,如果某个viewmodel需要来自持久化对象的数据子集,那么NHibernate很有用

DTO!=视图模型


在阵列中,ViewModel用于将模型与视图隔离。为了表示模型,您可以使用简单的类,这些类同样通过NHibernate映射到数据库。但我从未见过一个ViewModel类被建模为DTO。。ViewModel类大多具有DTO没有的行为

DTO-数据传输对象正如它所说的,是传输数据的容器。他们没有行为,只是一群二传手和干将。有些人使它们不可变,只在需要时创建新的,而不是更新现有的。它们应该是可序列化的,以允许跨线传输

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

然而,有些人使用屏幕绑定DTO的概念(与跨进程边界无关)。同样,这些数据由所需数据(通常是特定屏幕所需的数据,可以是来自不同来源的数据的集合)填充并发送给客户端

如前所述,在简单的情况下,此DTO可用于绑定到视图,但在更复杂的情况下,需要创建ViewModel并将数据从DTO卸载到ViewModel,这显然需要更多的工作(应用MVVM模式时)

同样,正如前面所说的,DTO=视图模型


DTO和ViewModel在生活中有不同的用途。ASP.NET MVC实践中的ViewModel与DTO相同,但是MVVM模式中的ViewModel与DTO不同,因为MVVM中的ViewModel有行为,而DTO没有行为。

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

第二,在ASP.NET MVC中使用DTO作为视图模型会使应用程序与DTO紧密耦合,这与使用DTO的目的正好相反。如果您这样做了,那么使用域模型或DTO(更复杂的反模式)有什么区别

ASP.NET中的ViewModel还可以使用数据批注进行验证

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

从您的演示文稿层,考虑DTO作为一个合同,您将收到一个对象,您必须将其视为对您的应用程序陌生,并且对它没有任何控制(即使您拥有该服务,DTO和表示层也是您的)。 最后,如果您进行这种干净的分离,开发人员可以轻松地协同工作。 设计视图模型、视图和控制器的人不必担心服务层或DTO实现,因为他将在其他开发人员完成其实现时进行映射。。。


他甚至可以使用模拟工具或手动模拟来用数据填充表示层以进行测试。

如果您将DTO用作ViewModel,这意味着您对DTO的依赖性很高,因为某些原因您正在更改DTO,那么它可能会影响ViewModel


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

我们可以使用与Model类相同的DTO,当我们需要在单个视图中显示/使用多个模型数据/属性时,我们可以使用viewmodel。示例:我首先使用实体框架数据库创建一些模型。所以,现在所有的模型都是基于数据库生成的。现在我们需要数据注释,对于那些数据注释,我们可以创建一个文件夹名DTO,在这个DTO文件夹中,我们可以保持所有已经生成的模型的精确性,并在属性上方添加数据注释。然后我们可以使用这个DTO类使用任何操作(使用控制器、视图)。当我们需要复杂的视图时,我的意思是当我们在一个视图中需要多个类数据时,我们可以使用viewmodel。对于viewmodel,我们可以创建一个文件夹名viewmodel,然后创建一个自定义类并保留我们需要的属性。我试着澄清自己。非常感谢您的任何建议

如果需要更改或增强数据以创建ViewModel。ViewModel也可以将DTO作为复杂属性引用

实际上,通常需要将视图特定的属性或方法添加到视图中使用的模型中。在这种情况下