我的问题基于Fowler PoEAA。鉴于您对此文本的熟悉程度,ASP.NET MVC中使用的ViewModels与DTO相同吗?为什么或者为什么不?谢谢。
答案 0 :(得分:81)
它们用于类似的目的(为应用程序的另一层封装数据),但它们以不同的方式执行它们。
DTO的目的是减少应用程序层之间的调用次数,尤其是当这些调用很昂贵时(例如分布式系统)。 DTO几乎总是易于序列化,几乎从不包含任何行为。
例如,您正在开发一个电子商务网站。 CreateCustomer
和AddCustomerAddress
是数据库级别的单独操作,但出于性能原因,您可能希望将其数据聚合到NewCustomerWithAddressDto
,以便您的客户端只需要进行一次往返服务器,并不需要关心服务器可能正在使用数据包做一堆不同的事情。
术语“ViewModel”在不同风格的MV *中意味着略有不同,但其目的主要是关注点的分离。您的模型经常针对除演示之外的某些目的进行优化,ViewModel负责将View与模型的实现细节分离。此外,大多数MV *模式建议尽可能使您的视图“愚蠢”,因此ViewModel有时会对表示逻辑负责。
例如,在同一个电子商务应用程序中,您的CustomerModel
在“新客户”视图中的呈现方式是错误的“形状”。对于初学者,您的View有两个表单字段供您的用户输入并确认其密码,而您的CustomerModel
根本不包含密码字段!您的NewCustomerViewModel
将包含这些字段,并且可能会根据您的MV *风格负责某些表示逻辑(例如显示/隐藏部分视图)和基本验证(例如确保两个密码字段都匹配)
答案 1 :(得分:15)
目的不同:
因此,通常ViewModels包含演示数据,在许多情况下,女巫与DTO中的内容类似,但有一些差异。想一想枚举,本地化,货币,日期格式等的表示。这是因为通常你的视图中没有逻辑。
答案 2 :(得分:15)
MVVM和MVP中的DTO通常是非常愚蠢的对象,基本上只是一堆属性设置器和getter。另一方面,ViewModels可能会有一些行为。
拥有DTO的实际积极的副作用是允许更容易的序列化。如果你有一个相当复杂的对象,例如C#,你经常会发现自己必须选择性地关闭你不想序列化的东西。这可能变得相当丑陋,DTO简化了这个过程。
答案 3 :(得分:1)
视图模型和数据传输对象有相似之处和不同之处。
类似: 将记录(对象实例,可能是序列化的)中的数据传输到接收器,无论是视图还是服务
差异: 视图模型旨在通过格式化发送到将显示它的视图。 View Model还将数据发送回控制器。 DTO通常不用于演示。它旨在发送原始数据。