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

mke*_*y33 48 asp.net-mvc design-patterns software-design poeaa

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

Iai*_*way 82

它们用于类似的目的(为应用程序的另一层封装数据)但是它们以不同的方式执行它们并且出于不同的原因.

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

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

  • 术语"ViewModel"在不同风格的MV*中意味着略有不同,但其目的主要是关注点的分离.您的模型经常针对除演示之外的某些目的进行优化,ViewModel负责将View与模型的实现细节分离.此外,大多数MV*模式建议尽可能使您的视图"愚蠢",因此ViewModel有时会负责表示逻辑.

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

  • 这是一个很好的解释!到目前为止,我见过的唯一视图模型只有 getter 和 setter,所以我想:哇,这太像 DTO。谢谢你帮我解决这个问题。 (2认同)

小智 16

目的不同:

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

因此,通常ViewModels包含演示数据,在许多情况下,类似于DTO中的情况,但有一些差异.想想枚举,本地化,货币,日期格式......的表示.这是因为通常在您的视图中不应该有逻辑.


Igo*_*aka 15

MVVM和MVP中的DTO通常都是非常愚蠢的对象,基本上只是一堆属性设置器和getter.另一方面,ViewModels可能会有一些行为.

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

  • +1,关键的区别在于DTO是愚蠢的(因此很容易序列化,这是他们的*工作*),而ViewModels可以包含原本会进入你视图的逻辑(这是他们的*工作). (3认同)
  • @Igor Zevaka 你能解释一下你所说的行为是什么意思吗? (3认同)