57

我将这个问题基于 Fowler PoEAA。鉴于您对本文的熟悉程度,ASP.NET MVC 中使用的 ViewModel 不与 DTO 相同吗?为什么或者为什么不?谢谢你。

4

5 回答 5

97

它们具有相似的目的(为应用程序的另一层封装数据),但它们以不同的方式和出于不同的原因进行。

  • DTO 的目的是减少应用程序层之间的调用次数,尤其是当这些调用很昂贵时(例如分布式系统)。DTO 几乎总是可以简单地序列化,并且几乎从不包含任何行为。

    例如,您正在开发一个电子商务网站。CreateCustomer并且AddCustomerAddress是数据库级别的单独操作,但您可能出于性能原因希望将它们的数据聚合到 aNewCustomerWithAddressDto中,以便您的客户端只需要与服务器进行一次往返,并且不需要关心服务器可能是用数据包做很多不同的事情。

  • 术语“ViewModel”在不同风格的 MV* 中的含义略有不同,但其目的主要是关注点分离。您的模型经常为展示以外的其他目的进行优化,并且 ViewModel 负责将您的视图与模型的实现细节分离。此外,大多数 MV* 模式建议让您的视图尽可能“愚蠢”,因此 ViewModel 有时会负责表示逻辑。

    例如,在同一个电子商务应用程序中,您CustomerModel在“新客户”视图上的展示“形状”是错误的。对于初学者,您的视图有两个表单字段供您的用户输入和确认他们的密码,而您的视图CustomerModel根本不包含密码字段!您NewCustomerViewModel将包含这些字段,并且可能会根据您的 MV* 风格负责一些表示逻辑(例如显示/隐藏部分视图)和基本验证(例如确保两个密码字段匹配)。

于 2009-09-16T07:28:33.160 回答
19

目的不同:

  • DTO 用于传输数据
  • ViewModel 用于向最终用户显示数据。

所以通常 ViewModels 包含表示数据,在很多情况下与 DTO 中的内容相似,但有一些区别。想想枚举、本地化、货币、日期格式的表示,...。这是因为通常您的视图中不应该有任何逻辑。

于 2009-09-16T07:18:20.870 回答
18

MVVM 和 MVP 中的 DTO 通常是非常愚蠢的对象,基本上只是一堆属性设置器和获取器。另一方面,ViewModel 可以有一些行为。

拥有 DTO 的一个实际积极的副作用是更容易进行序列化。如果你有一个相当复杂的对象,比如 C#,你经常会发现自己不得不有选择地关闭你不想序列化的东西。这可能会变得相当丑陋,而 DTO 简化了这个过程。

于 2009-09-16T07:52:18.743 回答
2

视图模型和数据传输对象有相似之处和不同之处。

类似:将记录(对象实例,可能是序列化)中的数据传输到接收器,无论是视图还是服务

区别:视图模型旨在发送到视图,将在其中显示,并带有格式。视图模型还将数据发送回控制器。DTO 通常不用于演示。它旨在发送原始数据。

于 2013-01-24T19:33:11.057 回答
0

两者都用于对进出后端的数据进行建模

视图模型模型数据从前端视觉系统(表单、用户输入等)到达后端,反之亦然,模型数据为了相同的目的发送到前端以满足某些视觉要求。

数据传输对象模型数据从某些客户端系统(后台 api、仍需要处理的数据、客户端后台服务等)到达后端,反之亦然,模型数据将发送到客户端系统。即使客户端系统可能具有可视元素,DTO 调用本身也用于非可视用例。

两者之间的技术差异源于上述两者的语义和上下文含义,例如视图模型可能具有更多行为。

于 2021-12-03T23:12:07.517 回答