我把这个问题基于Fowler PoEAA。由于你熟悉这个文本,ASP.NET MVC中使用的viewmodel不是DTO?为什么或者为什么不?谢谢。
解决方法
它们提供相似的目的(封装应用程序的另一层的数据),但是它们有不同的原因。
> DTO的目的是减少应用层之间的呼叫数,特别是当那些呼叫是昂贵的(例如分布式系统)时。 DTO几乎总是可序列化的,并且几乎不包含任何行为。
例如,您正在开发电子商务网站。 CreateCustomer和AddCustomerAddress在数据库级别是单独的操作,但是出于性能原因,您可能希望将其数据聚合到NewCustomerWithAddressDto中,以便您的客户端只需要进行一次往返服务器,并且不需要关心服务器可能正在做一堆不同的事情与数据包。
>术语“viewmodel”意味着不同口味的MV *稍有不同,但它的目的主要是分离关注点。您的模型经常针对演示之外的某些目的进行优化,viewmodel负责将您的View与Model的实现细节分离。此外,大多数MV *模式建议使视图尽可能“哑”,因此viewmodel有时负责表示逻辑。
例如,在同一个电子商务应用程序中,您的CustomerModel是在“新客户”视图上显示的错误“形状”。对于初学者,您的视图有两个表单字段供您的用户输入和确认其密码,而您的CustomerModel不包含密码字段!您的NewCustomerviewmodel将包含这些字段,并且根据MV *的风格,可能负责一些表示逻辑(例如显示/隐藏视图的部分)和基本验证(例如,确保两个密码字段匹配)。