我正在使用 NHibernate 来持久化我的域对象。为了简单起见,我使用 ASP.NET MVC 项目作为我的表示层和我的服务层。
我想从我的控制器类中以 XML 格式返回我的域对象。在阅读了 Stack Overflow 上的一些帖子后,我认为 DTO 是要走的路。但是,我也遇到过有关 ViewModel 的帖子。
我的问题:数据传输对象和视图模型是一回事吗?还是 ViewModel 是 DTO 的一种子模式?
我正在使用 NHibernate 来持久化我的域对象。为了简单起见,我使用 ASP.NET MVC 项目作为我的表示层和我的服务层。
我想从我的控制器类中以 XML 格式返回我的域对象。在阅读了 Stack Overflow 上的一些帖子后,我认为 DTO 是要走的路。但是,我也遇到过有关 ViewModel 的帖子。
我的问题:数据传输对象和视图模型是一回事吗?还是 ViewModel 是 DTO 的一种子模式?
DTO 的规范定义是没有任何行为的对象的数据形状。
ViewModel 是视图的模型。ViewModel 通常是来自一个或多个对象(或 DTO)的全部或部分数据以及特定于视图行为的任何其他成员(可以由视图执行的方法、指示如何切换视图元素的属性等)。您可以将视图模型视为视图和行为的所有数据。ViewModel 可能会或可能不会一对一地映射到业务对象或 DTO。
顺便说一句,如果某个视图模型需要来自持久对象的数据子集,NHibernate投影就会派上用场。
ASP.NET MVC 实践中的 ViewModel 与 DTO 相同,但 MVVM 模式中的 ViewModel 与 DTO 不同,因为 MVVM 中的 ViewModel 有行为,而 DTO 没有。
DTO - 数据传输对象正如它所说的,用于传输数据的容器。他们没有行为,只有一堆 setter 和 getter。有些人使它们不可变,只在需要时创建新的,而不是更新现有的。它们应该是可序列化的,以允许通过网络传输。
通常,DTO 用于跨进程边界将数据从一层传送到另一层,因为调用远程服务可能很昂贵,因此所有需要的数据都被推送到 DTO 并以一个块(粗粒度)传输到客户端。
但是,有些人使用屏幕绑定 DTO 的概念(与跨进程边界无关)。同样,这些填充有所需的数据(通常是特定屏幕所需的数据,并且可能是来自各种来源的数据的聚合)并发送到客户端。
http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx
如前所述,在简单的情况下,此 DTO 可用于绑定到视图,但在更复杂的情况下,它需要创建 ViewModel 并将数据从 DTO 卸载到 ViewModel,这显然需要更多工作(应用 MVVM 模式时) .
再次如前所述 DTO!=ViewModel
和
DTO和ViewModel在生活中有不同的用途
首先,主要区别在于 ViewModel 可以具有 DTO 不得具有的行为或方法!!!
其次,在 ASP.NET MVC 中使用 DTO 作为 ViewModel 使您的应用程序与 DTO 紧密耦合,这与使用 DTO 的目的完全相反。如果这样做,使用域模型或 DTO 有什么区别,获得反模式的复杂性更高?
ASP.NET 中的 ViewModel 也可以使用 DataAnnotations 进行验证。
同一个 DTO 可以有不同的 ViewModel 映射,一个 ViewModel 可以由不同的 DTO 组成(总是使用对象映射而不是组合)。因为我认为如果你有一个包含 DTO 的 ViewModel 会更糟,我们也会遇到同样的问题。
从您的表示层,将 DTO 视为一个合同,您将收到一个您必须将其视为对您的应用程序陌生的对象,并且无法对其进行任何控制(即使您拥有服务、dto 和表示层)是你的)。
最后,如果您进行这种干净的分离,开发人员可以轻松地一起工作。设计 ViewModels、Views 和 Controllers 的人不必担心服务层或 DTO 实现,因为他会在其他开发人员完成他们的实现时进行映射......他甚至可以使用 Mocking 工具或手动模拟来填充带有测试数据的表示层。
对于一些简单的视图,我将使用我的 DTO 作为我的模型,但随着视图变得更加复杂,我将创建 ViewModel。
对我来说,这是快速(使用 DTO,因为我已经拥有它们)和灵活性(创建 ViewModel 意味着更多的关注点分离)之间的平衡。
如果您需要更改或增强 DTO,请创建一个 ViewModel。ViewModel 也可以将 DTO 引用为复杂属性。
在实践中,您通常希望将特定于视图的属性或方法添加到您在视图中使用的模型中。在这种情况下,切勿根据您的视图要求修改 DTO。相反,创建一个 ViewModel 并将 DTO 映射到 ViewModel。
如果您将 DTO 用作 ViewModel,这意味着您高度依赖 DTO,因为某些原因您正在更改 DTO,那么它可能会影响 ViewModel。
更好地使用 DTO 并转换为视图模型。
我们可以使用DTO与 Model 类相同,当我们需要在单个视图中显示/使用多个模型数据/属性时,我们可以使用 viewmodel。示例:我首先使用实体框架数据库创建了一些模型。所以,现在所有的模型都是基于数据库生成的。现在我们需要数据注释,对于这些数据注释,我们可以创建一个名为 DTO 的文件夹,在这个 DTO 文件夹中,我们可以保留所有已经生成的模型,并在属性上方添加数据注释。然后我们可以使用这个 DTO 类进行任何操作(使用控制器、视图)。当我们需要复杂的视图时,我的意思是当我们需要一个视图中的多个类数据时,我们可以使用 viewmodel。对于 viewmodel,我们可以创建一个文件夹名称 viewmodel,然后创建一个自定义类并保留我们需要的属性。我试图清除自己。任何建议高度赞赏。