DDD核心概念
全称:领域驱动设计Domain-Driven Design
适用于复杂业务领域软件设计和开发
DDD分层结构
Client(提供给外部的接口)
实体
- Dto 封装响应数据(Response<XxxDto>)
- XxxRequest 封装请求数据
文件结构
- module
- api 提供给外部的接口
- req
- XxxRequest extend BaseRequest 封装请求数据
- dto
- XxxDto 封装响应数据
Entry(业务入口)
实体
无
文件结构
- module
- controller 实现client的api接口
- 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
- XxxAssembler
Assembler是组装器,负责完成domain model对象到dto的转换
- api 提供给Entry中controller的service接口
Domain(核心业务逻辑)
实体
- Req
- Po/Domain Entity 领域实体
持有自己的业务属性和业务行为
文件结构
- module
- model
- XxxReq封装传给Repository的参数
- po
- repository定义了和基础设施的持久化层的交互,使用po, req
- model
Infra(基础设施)
实体
- Do
文件结构
- module
- dataobject
- do
- converter
- do -> po
- po -> do
- RepositoryImpl
- mapper
- dataobject
- resource
- mapper
- module
- mapper.xml
- module
- mapper
分层中值得注意的点
实体创建在与其联系紧密的层
例如Client中定义api接口,使用Request入参,Response<**Dto**>出参
就在Client层中定义Request,DtoRepository的概念来自DDD框架,侧重领域(domain),
结构中Repository接口也被定义在了domain层
其中的操作类似java的List,以对象为基本元素进行操作1
2
3
4
5
6
7
8
9
10
11
12import 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
属于DAODao 和 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 | Request -> Param |
Request -> Param retrurn Po -> Dto
infra层
infra层Repository
-> Param入参 Po出参
调用
infra层Mapper
-> Param入参 Do出参
定义Converter(Do ->Po)
1 | Do Mapper.xx(Param) |
Param -> Param return Do -> Po