我使用NHibernate持久化我的域对象。为了简单起见,我使用一个ASP.NET MVC项目作为我的表示层和服务层。
我想从我的控制器类返回XML格式的域对象。在阅读了Stack Overflow上的一些帖子后,我认为DTO是一种可行的方式。然而,我也遇到了一些关于ViewModel的帖子。
我的问题是:数据传输对象和ViewModels是一回事吗?或者ViewModel是DTO的一种子模式?
发布于 2009-12-31 03:58:13
DTO的规范定义是没有任何行为的对象的数据形状。
ViewModels是视图的模型。ViewModels通常是来自一个或多个对象(或DTO)的完整或部分数据,外加特定于视图行为的任何附加成员(可由视图执行的方法、指示如何切换视图元素的属性等)。您可以将视图模型视为视图的所有数据加上行为。ViewModels可能会也可能不会一对一地映射到业务对象或DTO。
顺便说一句,如果某个视图模型需要来自持久化对象的数据子集,那么NHibernate projections就派上用场了。
发布于 2011-07-25 09:21:51
MVVM实践中的ViewModel与DTO是相同的,但ASP.NET模式中的ViewModel与DTO不同,这是因为MVVM中的ViewModel具有行为而DTO不具有行为。
发布于 2012-12-28 02:09:17
首先,主要区别在于ViewModel可以具有DTO不能具有的行为或方法!
其次,在ASP.NET MVC中使用DTO作为ViewModel使您的应用程序与DTO紧密耦合,这与使用DTO的目的完全相反。如果你这样做了,使用你的域模型或DTO会有什么不同,获得反模式会更复杂吗?
此外,ASP.NET中的ViewModel可以使用DataAnnotations进行验证。
同一个DTO可以有不同的ViewModels映射,并且一个ViewModel可以由不同的DTO组成(总是使用对象映射而不是组合)。因为我认为如果你有一个包含DTO的ViewModel,情况会更糟,我们也会遇到同样的问题。
在表示层,将DTO看作是一种约定,您将收到一个对应用程序来说是陌生的对象,并且对它没有任何控制(即使您拥有ex服务,dto和表示层也是您的)。
最后,如果您做到了这种干净的分离,开发人员就可以轻松地协同工作。设计ViewModels、视图和控制器的人不必担心服务层或DTO实现,因为当其他开发人员完成其实现时,他将进行映射。他甚至可以使用模拟工具或手动模拟来使用用于测试的数据填充表示层。
https://stackoverflow.com/questions/1982042
复制相似问题