VO、DTO与领域模型
为什么会有DTO?
我认为DTO的出现,是因为Domain Model(领域模型)与Presentation的脱节。
当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现的时候,DTO就会大量出现。
在.net平台下,DTO的出现还有另一个原因:.net下大量地使用“数据绑定”功能,能够方便地以可视化的方式把数据与界面绑定起来。但数据绑定只能是一维结构(一级属性),不支持多维绑定(N级属性),因此为了绑定方便,我们会大量地构造DTO。据说WPF的绑定支持多维绑定了,配合EF将是DTO厌恶者的福音 :)
DTO的出现与PO(Persistant object)的出现有着类似的经历。
PO是为了让领域模型持久化而产生的中间对象。
在没有ORM之前,领域模型要持久化(特别是数据库持久化),需要在POJO中增加许多与持久化相关的属性和方法,例如主键信息、对象的状态等。
而ORM出现之后,POJO就能够直接转化为PO了,程序员根据不用再把领域模型转为PO,而是把POJO丢给ORM处理,减轻了工作量。
现在DTO也是这样,领域模型与Presentation有差异,必须转换之后才能在页面上渲染。
那么我们需要一个领域模型与VO(View Object)自动映射的工具,以减轻我们编写DTO的无价值劳动。
但如果Presentation与领域模型相差太大,VO自动映射工具就无法自动映射出来,必须我们手动编写代码。
因此,我的观点是:在设计领域模型时,尽量顾及表现,这样就能把领域模型直接传到Presentation层使用。