- content
概念
Entity & ValueObject(Domain Primitive)
- Entity,有唯一标识,属性,并且有行为,建议属性的验证逻辑写在构造函数里面
- 注重唯一标识
- ValueObject,没有唯一标识,只有属性字段
- 注重数据字段
从数据库表结构的角度来看,Entity有着自己的业务主键,而 Value Object往往拥有一个指向所属 Entity 的外键,但是自己没有所谓的业务主键。还有一种方式是Value Object不用专门建表,而是从Entity对应表上抽出某几个字段。
贫血模型 –> 充血模型
贫血症带来失忆症
Domain Service
界限模糊不清,无法区分具体属于哪个领域模型的行为放到独立的Domain Service
聚合(Aggregate) & 聚合根(Aggregate Root)
Aggregate一般是Entity和ValueObject的集合,作为整体被外部访问,根节点Entity就是Aggregate Root,外部只访问它
Domain Events
一次事务只更新一个Aggregate,对于其它也需要同步更新的情况,可以通过DomainEvents来实现,多个Aggregate之间通过DomainEvents来互通
BC(Boundary Context)
在domain层不同领域之间的BC,java中一般通过package来区分
防腐层
-
应用之间的防腐层
- api gateway
- cola框架中client层
-
应用内部的防腐层
- cola框架中repository/cache/es对应的domain层的gataway接口层
最佳实践
cola框架
项目分层
层级依赖关系
实体模型之间的转换
DO | Entity | DTO | |
---|---|---|---|
目的 | 数据库表映射 | 业务逻辑 | 适配业务场景 |
代码层级 | Infrastructure | Domain | Application |
命名规范 | XxxDO | Xxx | XxxDTO |
XxxCommand | |||
XxxRequest等 | |||
字段名称标准 | 数据库表字段名 | 业务语言 | 和调用方商定 |
字段数据类型 | 数据库字段类型 | 尽量是有业务含义的类型,比如DP | 和调用方商定 |
是否需要序列化 | 不需要 | 不需要 | 需要 |
转化器 | Data Converter | Data Converter | |
DTO Assembler | DTO Assembler | ||
{: .table.table-bordered } |
转换工具
- Spring BeanUtils
- MapStruct
参考
阿里技术专家详解DDD系列 第一讲 - Domain Primitive