DDD
来自智得网
简介
2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称DDD。
领域驱动致力于建立领域专家,架构师,开发人员可以共同理解,可以相互交流的工具。
原理
基本概念
- 实体,对事物的抽象我们有了事物类型,比如桌子,学生,狗都是我们基于这些用户的特点以及特征进行的分类,一般可以对应到程序设计中的对象类型,实体一般指某个类型下的实例,比如某个学生,那条狗,实体具有唯一性。
- 值对象,值对象和实体对象的区别是实体对象有唯一的ID,但是值对象一般情况下更像是通用属性的一种表达,例如学生的性别,性能虽然是客观存在的,也有具体的值,但是性别在领域中一般会通过某种实体类型来聚合,很少单独存在。再比如说地址,地址也是归属到某个具体用户才有意义,单独的地址只是一个值,具体的意义不大。
- 聚合根,聚合根是把一些领域内联系紧密的实体和值对象聚合在一起,统一对外提供服务。不同的聚合根之间只能跨业务子域进行通信和数据交换。但是聚合根内的实体因为归属于一个子域,所以更方便频繁的数据以及业务交互。
分层架构
DDD一般分为四层:
用户接口层
用户接口层可以对外提供多种协议,例如RPC接口,http接口或者MQ,接口层一般不强调复用,而更加强调单一职责。
应用层
应用层主要用来实现用户层定义的接口,基于充血模型实现的架构,应用层的逻辑不应该太厚,应该把逻辑下沉到领域层,应用层接口可以按照CQRS(命令查询分离)的模式来组织。
领域层
领域层包含聚合根,实体,值对象等,这些对象建议不仅仅包括字段的定义,而是包含相关的业务逻辑。
领域层的逻辑主要由实体承载,一般不提供单独的领域服务(Service),除非需要处理多个领域对象的场景。
领域层承担了主要的业务逻辑,和上游的交互逻辑一般分为下面几种情况。
- 修改领域对象,首先通过仓储获取领域对象,调用领域对象的相关业务方法以完成业务逻辑处理;如果领域对象发生变更,则通过仓储层进行保存。
- 新增领域对象,通过构造函数或工厂创建出领域对象,如果需要还可以继续对该新创建的领域对象做一些操作,然后把该新创建的领域对象添加到仓储中;
- 删除领域对象,可以先把领域对象从仓储中取出来,然后将其从仓储中删除,也可以直接传递一个要删除的领域对象的唯一标识给仓储通知其移除该唯一标识对应领域对象;
- 如果一个业务逻辑涉及到多个领域对象,则调用领域层中的相关领域服务完成操作;
基础设施层
基础设施层主要包括对外接口,仓储层以及工具类。
仓储层和MVC分层概念下的DAO(数据访问层)类似,其业务含义是当领域中的对象发生变更的时候,需要在持久化存储进行保存,而且重建领域实体也需要仓储层提供服务。