asp.net mvc - DTO=ViewModel?



asp.net-mvc domain-driven-design (5)

DTO!= ViewModel

MVVM模式中,ViewModel用于将模型从视图中分离出来。 为了表示模型​​,你可以使用简单的DTO类,它们通过例如NHibernate再次映射到数据库。 但我从来没有见过一个ViewModel类被建模为DTO。ViewModel类大多都有行为,而DTO没有。

https://ffff65535.com

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

我想从我的控制器类以XML返回我的域对象。 在阅读堆栈溢出的一些帖子之后,我收集DTOs是要走的路。 但是,我也遇到过有关ViewModel的文章。

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


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


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

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

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


如果你将DTO用作ViewModel,这意味着你正在DTO上高调,因为你正在改变DTO,那么它可能会影响ViewModel。

更好地使用DTO并将其转换为视图模型。


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

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

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

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

从你的表示层,考虑DTO作为契约,你将会得到一个对象,你必须认为它对你的应用程序陌生,并且没有任何控制权(即使你有这个服务,dto和表示层是你的)。

最后,如果你做到这一点清晰的分离,开发人员可以轻松地一起工作。 设计ViewModels,Views和Controllers的人不必担心服务层或DTO的实现,因为当其他开发人员完成实现时他会进行映射......他甚至可以使用Mocking工具或手动模拟来填充带有测试数据的表示层。





dto