DDD(领域驱动设计)

207 阅读3分钟

DDD核心知识体系

DDD 核心知识体系

什么是DDD

DDD 是一种 架构设计方法,DDD 主要关注:从业务领域视角划分领域边界,构建通用语言进行高效沟通,通过业务抽象,建立领域模型,维持业务和代码的逻辑一致性。

DDD的关键概念

  • 领域:业务范围

  • 子域:领域可以划分为不同的子域,子域可以进一步划分为更小的子域。

子域可以分为 核心域通用域支撑域

  • 通用语言:项目团队沟通和协调形成的统一语言

  • 限界上下文:确定语义所在的领域边界,限界上下文是微服务设计和拆分的主要依据

  • 实体:实体一般对应业务对象,它具有业务属性和业务行为。状态可变,依附于聚合根,生命周期由聚合根管理

  • 值对象:值对象主要是属性集合,对实体的状态和特征行为进行描述

  • 聚合:聚合就是由业务和逻辑紧密关联的实体和值对象组合而成。

  • 聚合根:聚合之间通过聚合根关联引用,如果需要访问其他的聚合的实体,就要先访问聚合根,再导航到聚合内部实体,外部对象不能直接访问聚合内部实体。聚合根也是实体,有实体的特点。

业务领域模型转为程序的两种设计思路

贫血模型

在软件设计中,有很多 POJO 对象,它们除了有一堆 get/set 方法,集合没有任何业务逻辑,即领域对象中的属性与业务行为拆分开。

优点

  1. 更契合 MCV 三层架构
  2. 实现简单
缺点
  1. 表达力不足,领域对象无法很好的表达业务行为
  2. 逻辑分散,业务行为分散在 service 中,复杂的业务实现会导致服务臃肿

充血模型

领域对象中包含具体的业务操作

优点

  1. 契合 DDD 的设计理念,领域对象直接表达逻辑的实体
  2. 可读性高,业务逻辑都体现在领域对象中

缺点

  1. 违背单一职责原则,领域对象可能承担数据存储和业务行为,职责不够单一

  2. 实现复杂

DDD 分层架构

传统的四层架构

传统的四层架构

基础层被其他层依赖,基础层更像是核心层,但实际上领域层才是核心层。

DDD的优化后的四层结构

DDD 优化后的四层结构

领域层作为核心层

各层级的职责

DDD各层级职责

其中应用层应该是很薄的一层,理论上不应该有业务规则和逻辑。应用层也是微服务之间交互的通道

防腐层(Anticorruption Layer, ACL)

用于隔离核心领域模型与外部系统或上下文之间的耦合。它通过引入一个独立的转换层,将外部系统的数据或行为与核心领域模型进行解耦,防止外部系统的复杂性或变化对核心领域模型造成侵蚀或影响。

资料