领域驱动设计DDD

46 阅读3分钟

DDD是一种开发复杂软件的系统化的方法学和思想

你会写熟练的写java代码,那就可以说你掌握了面向对象的编程方法; 假如你很熟悉面向对象的设计原则,掌握了很多设计模式,那可以说你懂得面向对象的编程方法; 假如你能为业务构建领域模型,那么你就懂了面向对象的分析方法。面向对象的分析,设计,编码三种方法融会贯通,成为一个有机的整体,这个叫面向对象的方法学。

领域驱动主要开发流程

screenshot-20240116-111212.png

领域模型

我们创建领域模型,主要是识别领域对象(domain object) 领域对象之间的关系,以及领域对象的关键属性,必要的时候还要讲领域对象组织成模块。 什么是领域对象呢,我们系统中要处理的各种“实物”就是领域对象。 领域模型是用领域模型图来表达的,通常用UML来画。 DDD中讲领域对象分为实体(entity)和值对象(value object)

screenshot-20240116-142810.png

screenshot-20240116-142823.png

DDD领域建模和传统方法有什么不同之处? DDD强调领域模型要兼顾业务和技术两个视角

DDD的领域模型是业务视角和技术视角的交集

分层架构

screenshot-20240116-143935.png

代码中不稳定的部分,应该依赖稳定的部分。 分层架构中越是内层,就越稳定,内层不能依赖外层。 分离领域是DDD的基本要求。

domain:领域模型层。在domain包中,根据领域模型中的模块进一步分包。

screenshot-20240116-144552.png

给领域一个“门面”

领域层封装的是细粒度的,并不适合直接做为API暴露给外部。另外还有一些不属于领域层的横切关注点,比如实物控制等,应该单独处理。所以我们在领域层外面在加一层,DDD和六边形架构都讲这一层成为Application,也就是应用层

应用层主要负责以下逻辑:

  1. 接收客户端的请求,协调和调用领域层的逻辑来解决问题。
  2. 将领域层的处理结果封装为更简单的粗粒度对象,作为对外API的参数。这里说的粗粒度对象一般是DTO(Data Transfer Object),也就是没有逻辑的数据传输对象,应用层负责DTO和领域对象的数据转换。
  3. 负责处理事务,日志,权限等横切关注点

用“适配器"处理输入输出。

  • 领域层:用来封装领域数据和逻辑。这一层将与领域模型直接对应,是整个系统的核心;
  • 应用层:作为领域层的”门面“,把领域层封装成更粗粒度的服务功外部使用,并处理事务,日志等横切关注点;
  • 被动适配器:用来接收外部的请求。屏蔽具体的输入输出技术;
  • 主动适配器:用来访问外部资源。主动适配器和被动适配器都属于适配器,区别在于调用的方向不同。适配器层与具体输入输出和资源访问技术有关,而应用层和领域层与具体技术无关。这样我们就分离了技术和业务的关注点。
  • common层 用来存放工具和框架

充血模型和贫血模型

贫血模型指的是 领域对象中只有数据,没有行为。 充血模型 领域对象中既包含数据,也包含行为。

表意接口:把规则抽取成独立的方法,每个方法按照含义进行命名。这种做法是DDD的一个模式,叫做”Intention-Revealing Interfaces“ 可以译做 表意接口。

"领域服务"(Domain Service)模式 实现校验规则的那些方法, **Validator 也就是校验器 放到domain里 在application中调用,为了避免 validator过大,可以进一步拆成几个小的Validator。

使用assembler(装配器)的对象进行领域对象和DTO之间的转换。