DDD领域驱动设计笔记
摘自:dax.net陈晴阳博客
1.NLayerApp是经典的DDD架构
2.基础结构层:包括两方面内容,处理数据访问的基础结构层组件主要包含了仓储的具体实现、Unit Of Work(PoEAA,Martin Fowler)的实现、NLayerApp的实体模型定义,以及为单体测试做准备的Service Stubs(PoEAA,Martin Fowler);Cross-Cutting的基础结构层组件则主要包含了IoC(Inversion of Control)容器以及跟踪应用程序执行过程的Trace工具。虽然这些都是基础结构层的组件,但也包含了很多技术细节甚至是设计要点,就让我们一起对这些内容做一个详细的解读。
3.关注点分离:分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用。
4.仓储不是Data Object,也不仅仅是进行数据库CRUD操作的Data Manager,它承担了解耦领域模型和技术架构的重要职责。
5.依赖注入是维持领域模型纯净度的一大利器;另一大利器是领域事件..net中微软有一个轻量级的IoC框架Unity,支持构造器注入,属性注入.IOC作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口。当系统重构的时候,代码的改写量将大大减少。通常有调用者来创建被调用者的实例。创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称为依赖注入。
6.领域层:包含了业务所涉及的领域对象(实体、值对象)、领域服务以及它们之间的关系。这部分内容的具体表现形式就是领域模型(Domain Model)。领域驱动设计提倡富领域模型,即尽量将业务逻辑归属到领域对象上,实在无法归属的部分则以领域服务的形式进行定义。表现层与应用层之间是通过DTO进行交互的,DTO是没有行为的POCO对象,目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样做会直接将领域对象的行为暴露给表现层
7.应用层:
数据传输对象DTO需要说明的几点
1)DTO的设计需要面向客户端(包括客户端应用程序、与外部系统集成的Web Services等),客户端的View Model需要什么样的数据,就设计什么样的DTO。应用层负责收发DTO数据,并根据DTO数据访问领域模型中的实体,根据实体组装DTO。ORM解决的是Domain Model与关系型数据库之间的阻抗失衡,而DTO解决的是View Model与Domain Model之间的阻抗失衡
2)DTO应该是POCO,它不能依赖于任何技术框架
3)对于中小型系统,可以考虑使用类似NLayerApp的Serialized Domain Entities方式,这可以提高开发效率;但如果是大型系统,还是建议使用DTO,有朋友会觉得每次根据View Model去设计DTO很耗时,但我觉得如果应用程序规模较大的时候,还是做足功夫比较好,磨刀不误砍柴工,这样在今后做系统集成的时候也会方便一些。可以考虑使用DSL与自动化代码生成技术来解决DTO的设计问题
4)WCF产生的代理类Data Contracts就是一种DTO,如果专用微软的技术,那么也就与上述第二点不矛盾,Serialized Domain Entities可以以Data Contracts的形式出现在客户端程序中,一定程度上屏蔽了直接将Serialized Domain Entities用作DTO的负面影响
8.Specification是值对象,它是领域层的一部分,同样也不会去关心持久化技术实现细节。规约是一种布尔断言,它表述了给定的对象是否满足当前约定的语义。
DDD领域驱动设计qq群:463810724