视图模型和数据传输对象有什么区别?

我在福勒PoEAA基础上的这个问题。 鉴于您对本文的熟悉,是不是在ASP.NET MVC中使用的ViewModel与DTO相同? 为什么或者为什么不? 谢谢。

他们服务于类似的目的(为另一层应用程序封装数据),但是他们做了不同的处理,原因不同。

  • DTO的目的是减less应用层之间的呼叫次数,特别是当这些呼叫昂贵时(例如分布式系统)。 DTO几乎总是可串行化的,几乎从不包含任何行为。

    例如,您正在开发电子商务网站。 CreateCustomerAddCustomerAddress是数据库级别的独立操作,但是出于性能原因,您可能想要将它们的数据聚合到NewCustomerWithAddressDto以便客户端只需进行一次往返服务器的操作,而无需关心服务器可能会对数据包做很多不同的事情。

  • 术语“ViewModel”在不同风格的MV *中意味着稍微不同的东西,但其目的主要是分离关注点。 您的模型经常针对演示以外的其他目的进行优化,ViewModel负责将视图与模型的实现细节分离。 此外,大多数MV *模式build议尽可能使您的视图为“哑”,因此ViewModel有时会承担演示逻辑的责任。

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

目的不同:

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

所以通常情况下,ViewModel包含了演示数据,巫婆在很多情况下类似于DTO中的内容,但有一些差异。 想想枚举,本地化,货币,date格式,…的表示。 这是因为在你看来,通常应该没有逻辑。

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

具有DTO的实际积极的副作用是允许更容易的序列化。 如果你有一个相当复杂的对象,例如C#,你会经常发现自己不得不select性地closures你不想序列化的东西。 这可以变得相当丑陋,DTO简化了这个过程。

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

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

差异:视图模型旨在发送到一个视图,其中将显示,格式。 视图模型也将数据发送回控制器。 DTO通常不是为了演示。 它旨在发送原始数据。