DDD 基础概念
概念
领域 与 子域
- DDD 的领域就是这个边界内要解决的业务问题域。
- 我们把划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或更小的业务范围。
核心域、通用域和支撑域
这三类为三种不同的子域,不同系统中,核心域不尽相同,需要公司根据自身业务,选定核心域等,完成划分
- 决定产品和公司核心竞争力的子域是核心域
- 同时被多个子域使用的通用功能子域是通用域
- 必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域。
限界上下文
通用语言定义上下文含义,限界上下文则定义领域边界
为什么要提出限界上下文的概念?
在事件风暴过程中,通过团队交流达成共识的,能够简单、清晰、准确描述业务涵义和规则的语言就是通用语言。通用语言可以直接反应在代码中。
1、但是通用语言难以完成领域的划分,进而确定微服务的划分,解决微服务想要解决的问题
2、通用语言在不同上下文中会有不同的含义,引入限界上下文,可以提供上下文环境,消除歧义。
限界上下文在微服务设计中的作用和意义是什么?
1、封装通用语言和领域对象,让大家明白功能应该放于哪个领域。
2、划分领域边界,确定限界上下文,消除歧义。
实体 和 值对象
实体和值对象是组成领域模型的基础单元。
实体
- 有 ID 标识,聚合内唯一
- 这些实体类通常采用充血模型
- 依附于聚合根,其生命周期由聚合根管理
- 与数据库持久化对象不一定是 一对一的关系
- 可以引用聚合内的聚合根、实体和值对象
值对象
- 不可变,无生命周期,用完即扔
- 通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体
- 简单来说,值对象本质上就是一个集。由若干个用于描述目的、具有整体概念和不可修改的属性组成
- 值对象尽量只引用值对象
DDD 提倡从领域模型设计出发,而不是先设计数据模型
聚合和聚合根
聚合
- 高内聚、低耦合,它是领域模型中最底层的边界,可以作为拆分微服务的最小单位
- 聚合让一些列实体和值对象协同工作,确保这些领域对象在实现共同业务时,保持一致性
- 聚合之间的边界是微服务内天然的逻辑边界
聚合根
- 聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期
- 聚合相对于组织的话,聚合根则为这个组织的管理者,协调实体和值对象,完成功能
- 一个聚合只有一个聚合根,聚合根在聚合内对实体和值对象采用直接对象引用的方式进行组织 和协调
- 聚合根与聚合根之间通过 ID 关联的方式实现聚合之间的协同
- 其他聚合调用其他聚合中的对象,均需要通过聚合根调用
如何设计聚合
1、根据事件风暴,梳理出实体和值对象
2、从实体中选出聚合根
3、根据单一职责,以聚合根为核心,划分出所有的相关实体和值对象(整理出依赖模型,确定依赖关系),此为一个聚合
4、将多个聚合根据业务语义和上下文划分到同一个限界上下文中,结束聚合设计
欢迎大家关注公众号一起交流