DDD框架

2.1k words

DDD核心概念

全称:领域驱动设计Domain-Driven Design
适用于复杂业务领域软件设计和开发


DDD分层结构

图片不存在

Client(提供给外部的接口)

实体

  • Dto 封装响应数据(Response<XxxDto>)
  • XxxRequest 封装请求数据

文件结构

  • module
    • api 提供给外部的接口
    • req
      • XxxRequest extend BaseRequest 封装请求数据
    • dto
      • XxxDto 封装响应数据

Entry(业务入口)

实体

文件结构

  • module
    • controller 实现client的api接口

App(服务编排)

组装domain层各个组件及基础设施层的公共组件,完成具体的业务服务

实体

文件结构

  • module

    • api 提供给Entry中controller的service接口
      • XxxService
    • service 实现service接口
      • XxxServiceImpl

    这里的service是组件粘合剂,组合domain层的各个组件和 infrastructure层的持久化组件、消息组件等等

    • assembler
      • XxxAssembler
        • po(s) -> dto(s)
        • request -> req
        • create/update po return po

    Assembler是组装器,负责完成domain model对象到dto的转换


Domain(核心业务逻辑)

实体

  • Req
  • Po/Domain Entity 领域实体

    持有自己的业务属性和业务行为

文件结构

  • module
    • model
      • XxxReq封装传给Repository的参数
      • po
    • repository定义了和基础设施的持久化层的交互,使用po, req

Infra(基础设施)

实体

  • Do

文件结构

  • module
    • dataobject
      • do
    • converter
      • do -> po
      • po -> do
    • RepositoryImpl
    • mapper
  • resource
    • mapper
      • module
        • mapper.xml



分层中值得注意的点

  1. 实体创建在与其联系紧密的层

    例如Client中定义api接口,使用Request入参,Response<**Dto**>出参
    就在Client层中定义Request,Dto

  2. Repository的概念来自DDD框架,侧重领域(domain),
    结构中Repository接口也被定义在了domain层
    其中的操作类似java的List,以对象为基本元素进行操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.util.List;
    import com.thinkinginobjects.domainobject.Account;

    public interface AccountRepository {

    void addAccount(Account account);
    void removeAccount(Account account);
    void updateAccount(Account account); // Think it as replace for set

    List query(AccountSpecification specification);

    }

    此处DDD中的Mapper属于DAO

    Dao 和 Repository十分相近,平时使用不用过于纠结


DDD分层实现

client层

  • 定义Controller接口 -> Request入参 Dto出参
    1
    Dto Controller.xx(Request)

entry层

  • Controller实现 -> 调用Service(app层)

app层

  • 定义Service接口 -> Request入参 Dto出参

    1
    Dto Service.xx(Request)
  • Service实现 -> 调用Repository(domain层)


domain层

  • 定义Repository接口 -> Param入参 Po出参
    1
    Po Repository.xx(Param)

infra层

  • Repository实现 -> 调用Mapper(infra层)

  • 定义Mapper接口 -> Param入参 Do出参

    1
    Do Mapper.xx(Param)
  • Mapper实现 -> Mapper.xml


DDD实体类型转换

app层

app层
Service -> Request入参 Dto出参
调用
domain层
Repository -> Param入参 Po出参

定义Assembler(Request -> Param, Po -> Dto)

1
2
3
4
Request -> Param
Po Repository.xx(Param)
Po -> Dto
return Dto

Request -> Param retrurn Po -> Dto

infra层

infra层
Repository -> Param入参 Po出参
调用
infra层
Mapper -> Param入参 Do出参

定义Converter(Do ->Po)

1
2
3
Do Mapper.xx(Param)
Do -> Po
return Po

Param -> Param return Do -> Po