• 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,外部只访问它

AggregateRoot

Domain Events

一次事务只更新一个Aggregate,对于其它也需要同步更新的情况,可以通过DomainEvents来实现,多个Aggregate之间通过DomainEvents来互通

BC(Boundary Context)

在domain层不同领域之间的BC,java中一般通过package来区分

防腐层

  • 应用之间的防腐层

    • api gateway
    • cola框架中client层
  • 应用内部的防腐层

    • cola框架中repository/cache/es对应的domain层的gataway接口层

最佳实践

cola框架

项目分层

DDD分层

层级依赖关系

实体模型之间的转换

  DO Entity DTO
目的 数据库表映射 业务逻辑 适配业务场景
代码层级 Infrastructure Domain Application
命名规范 XxxDO Xxx XxxDTO
XxxCommand      
XxxRequest等      
字段名称标准 数据库表字段名 业务语言 和调用方商定
字段数据类型 数据库字段类型 尽量是有业务含义的类型,比如DP 和调用方商定
是否需要序列化 不需要 不需要 需要
转化器 Data Converter Data Converter  
DTO Assembler DTO Assembler    
{: .table.table-bordered }      

DTO-Entity-DO

转换工具

  • Spring BeanUtils
  • MapStruct

参考

阿里技术专家详解DDD系列 第一讲 - Domain Primitive

阿里技术专家详解DDD系列 第二弹 - 应用架构

阿里技术专家详解DDD系列 第三讲 - Repository模式

DDD系列第四讲:领域层设计规范

美团-领域驱动设计在互联网业务开发中的实践

康威定律