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*的风格负责某些表示逻辑(例如,显示/隐藏部分视图)和基本验证(例如,确保两个密码字段都匹配).
小智 16
目的不同:
因此,通常ViewModels包含演示数据,在许多情况下,类似于DTO中的情况,但有一些差异.想想枚举,本地化,货币,日期格式......的表示.这是因为通常在您的视图中不应该有逻辑.
Igo*_*aka 15
MVVM和MVP中的DTO通常都是非常愚蠢的对象,基本上只是一堆属性设置器和getter.另一方面,ViewModels可能会有一些行为.
具有DTO的实际积极副作用允许更容易的序列化.如果你有一个相当复杂的对象,例如C#,你经常会发现自己必须选择性地关闭你不想序列化的东西.这可能会变得相当丑陋,DTO简化了这个过程.
归档时间: |
|
查看次数: |
12907 次 |
最近记录: |