2009-09-16 63 views

回答

71

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

  • 一个DTO的目的是减少的应用层之间的呼叫的数量,尤其是当这些呼叫是昂贵的(例如,分布式系统)。 DTO几乎总是可以序列化的,几乎从不包含任何行为。

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

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

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

+0

这是一个很好的解释!到目前为止,我所见过的唯一视图模型只有getter和setter,所以我就是这样:哇,这很像DTO。感谢您为我清理这个。 – mkelley33 2009-09-16 11:48:55

11

的目的是不同的:

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

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

10

的DTO在MVVM和MVP通常是非常愚蠢的对象和基本上只是一堆属性getter和setter方法的。 ViewModels另一方面可能会有一些行为。

具有DTOs的实际积极影响允许更容易的序列化。如果你有一个相当复杂的对象,比如C#,你会经常发现自己不得不有选择性地关闭你不想序列化的东西。这可能会变得相当难看,DTO简化了这个过程。

+3

+1,关键的区别在于DTOs是愚蠢的(因此可以简单地序列化,这是他们的* job *),而ViewModels可以包含否则会进入你的视图(这是*他们*作业)的逻辑。 – 2009-09-17 08:22:41

+0

@Igor Zevaka你能解释一下你的行为是什么意思吗? – 2016-03-11 07:53:29

1

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

类似的:在一个记录 传输数据(对象实例,或许串行化)到接收器,是否一个视图或服务

差异: 视图模型旨在被发送到一个浏览,在那里它将显示格式。 视图模型也将数据发送回控制器。 DTO通常不适用于演示文稿。它旨在发送原始数据。

相关问题