视图模型和数据传输对象有啥区别?
Posted
技术标签:
【中文标题】视图模型和数据传输对象有啥区别?【英文标题】:what is the difference between a view model and a data transfer object?视图模型和数据传输对象有什么区别? 【发布时间】:2010-11-28 17:19:37 【问题描述】:我是根据 Fowler PoEAA 提出这个问题的。鉴于您对本文的熟悉程度,ASP.NET MVC 中使用的 ViewModel 不与 DTO 相同吗?为什么或者为什么不?谢谢你。
【问题讨论】:
【参考方案1】:它们的用途相似(为应用程序的另一层封装数据),但它们的用途不同,原因也不同。
DTO 的目的是减少应用程序各层之间的调用次数,尤其是当这些调用代价高昂时(例如分布式系统)。 DTO 几乎总是可以简单地序列化,并且几乎从不包含任何行为。
例如,您正在开发一个电子商务网站。 CreateCustomer
和 AddCustomerAddress
是数据库级别的单独操作,但出于性能原因,您可能希望将它们的数据聚合到 NewCustomerWithAddressDto
中,以便您的客户端只需往返服务器一次,并且不会不需要关心服务器可能会对数据包做很多不同的事情。
“ViewModel”一词在不同风格的 MV* 中的含义略有不同,但其目的主要是关注点分离。您的模型经常为展示以外的其他目的进行优化,并且 ViewModel 负责将您的视图与模型的实现细节分离。此外,大多数 MV* 模式都建议让您的视图尽可能“愚蠢”,因此 ViewModel 有时会负责表示逻辑。
例如,在同一个电子商务应用程序中,您的CustomerModel
是错误的“形状”,无法在您的“新客户”视图上显示。对于初学者,您的视图有两个表单字段供您的用户输入和确认他们的密码,而您的 CustomerModel
根本不包含密码字段!您的NewCustomerViewModel
将包含这些字段,并且可能会根据您的 MV* 风格负责一些表示逻辑(例如显示/隐藏视图的一部分)和基本验证(例如确保两个密码字段匹配)。
【讨论】:
这是一个很好的解释!到目前为止,我看到的唯一视图模型只有 getter 和 setter,所以我想:哇,这太像 DTO 了。感谢您为我解决这个问题。【参考方案2】:目的不同:
DTO 用于传输数据 ViewModel 用于向最终用户显示数据。所以通常 ViewModel 包含表示数据,在很多情况下与 DTO 中的内容相似,但有一些不同。想想枚举、本地化、货币、日期格式的表示,...。这是因为通常你的视图中不应该有任何逻辑。
【讨论】:
【参考方案3】:MVVM 和 MVP 中的 DTO 通常是非常愚蠢的对象,基本上只是一堆属性设置器和获取器。另一方面,ViewModel 可以有一些行为。
拥有 DTO 的一个实际积极的副作用是可以更轻松地进行序列化。如果你有一个相当复杂的对象,比如 C#,你经常会发现自己不得不有选择地关闭你不想序列化的东西。这可能会变得相当丑陋,而 DTO 简化了这个过程。
【讨论】:
+1,主要区别在于 DTO 很愚蠢(因此可以简单地序列化,这是他们的工作),而 ViewModel 可以包含原本会进入您的查看(这是他们的工作)。 @Igor Zevaka 你能解释一下你所说的行为是什么意思吗?【参考方案4】:View Model 和 Data Transfer 对象有相同点和不同点。
类似: 将记录中的数据(对象实例,可能是序列化的)传输到接收器,无论是视图还是服务
区别: 视图模型旨在发送到视图,它将在其中显示,并带有格式。 视图模型还将数据发送回控制器。 DTO 通常不用于演示。它旨在发送原始数据。
【讨论】:
【参考方案5】:两者用于对传入和传出后端的数据进行建模的目的相同。
View Models 模型数据从前端视觉系统(表单、用户输入等)到达后端,反之亦然,模型数据被发送到前端用于相同目的以满足某些视觉需求。
数据传输对象模型数据从某些客户端系统(后台 api、仍需要处理的数据、客户端后台服务等)到达后端,反之亦然,模型数据将发送到客户端系统。即使客户端系统可能有可视元素,DTO 调用本身也用于非可视用例。
两者之间的技术差异源于如上所述两者的语义和上下文含义,例如视图模型可能具有更多行为。
【讨论】:
以上是关于视图模型和数据传输对象有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
MVVM模式下,ViewModel和View,Model有啥区别
MVVM模式下,ViewModel和View,Model有啥区别