DDLA (Domain Driven Design Layered Architecture), 结合了领域驱动设计思想和六边形架构思想,是DDD实践下的一种分层架构。
使用如下maven命令,替换groupId、artifactId、version、package等参数为你期望的值。
mvn archetype:generate \
-DgroupId=com.lazycece.ddlademo \
-DartifactId=ddlademo \
-Dversion=1.0.0-SNAPSHOT \
-Dpackage=com.lazycece.ddlademo \
-DarchetypeArtifactId=ddla-archetype \
-DarchetypeGroupId=com.lazycece.ddla \
-DarchetypeVersion=${ddla-archetype.version}
各模块职责如下:
- adapter:适配器层,是系统流量的入口,将请求分发给应用层去处理具体应用逻辑。该层涵盖业务接口请求、批处理、消息等。
- facade:门面层,作为系统的门面,用于表达系统对外暴露的能力。
- application:应用层,是系统的应用逻辑编排层,用于做跨系统或者跨聚合的业务编排,不表达核心控制能力。
- domain:领域层,作为领域驱动架构的内核,其承载的是系统的核心模型、规则与服务,是整个系统的大脑所在。
- infrastructure:基础设施层,是系统的基座,其支撑着领域层;该层的定位主要是系统基础能力(缓存、存储等)、下游支撑系统的集成、领域能力的防腐等。
.
|-- app
| |-- adapter
| |-- application
| |-- domain
| |-- facade
| `-- infrastructure
| |-- acl
| |-- dal
| |-- integration
|-- bootstrap
|-- conf
`-- test
工程结构的各目录职责如下:
- app:工程应用存放代码的目录,其中子目录是前面架构分层中所说的不同模块
- bootstrap:应用的启动器,以及除环境之外的配置信息
- conf:环境相关的配置信息
- test:工程相关的测试代码
在工程结构上,将基础设施层按职责进行了再次拆分:
- dal: 数据库交互模块
- integration:系统集成模块,比如与下游系统的集成,其他基础能力的集成
- acl:系统防腐层,领域与基础设置之间的防腐隔离
声明参数如下:
- package 表示指定业务包的父路径,如 com.lazycece.tradecore
- agg 表示业务聚合标识,如订单 order
- inm 表示集成业务模块
除以下基本规范之外,实际实践中亦可以根据实际情况来添加或修改包路径,以便达到最佳实践效果。
模块 | 模块描述 | 父package | 子package | 规范示例 | 规范说明 |
---|---|---|---|---|---|
adapter | 适配器 | ${package}.adapter | mobile | XxxAdapter | 定义移动端服务适配器 |
web.{agg} | XxxController | 定义web接口适配器 | |||
job | XxxJob | 定义任务适配器 | |||
consumer | XxxConsumer | 定义消息消费者适配器 | |||
facade | 应用门面 | ${package}.facade | ${agg}.api | XxxCommandFacade XxxQueryFacade |
使用CQRS架构模式定义系统门面服务,可用于暴露rpc/rest服务sdk |
{agg}.dto | XxxDTO | 定义聚合内公用的实体DTO | |||
{agg}.enums | XxxEnum | 定义聚合内需要供外部使用的枚举 | |||
{agg}.request | XxxRequest | 定义服务请求体 | |||
{agg}.result | XxxResult | 定义服务响应结果 | |||
application | 应用层 | ${package}.application | ${agg} | XxxCommandFacadeImpl XxxQueryFacadeImpl |
定义业务聚合服务应用层实现,可对外暴露服务 |
${agg}.assembler | XxxAssembler | 定义数据编译器,实现应用层同下层(领域/基础设施)之间的数据编译构建 | |||
${agg}.handler | XxxHandler | 定义服务处理器 | |||
${agg}.converter | XxxConverter | 定义数据转换器,实现应用层同下层(领域/基础设施)之间的对象转换 | |||
${agg}.validator | XxxValidator | 定义业务请求校验器,实现复杂参数校验 | |||
domain | 领域层 | ${package}.domain | ${agg}.event | -- | 定义领域事件相关定义 |
${agg}.factory | XxxFactory | 定义聚合相关的工厂类 | |||
${agg}.model | -- | 定义聚合、实体、值对象等信息 | |||
${agg}.repository | XxxRepository | 定义聚合内相关仓库接口 | |||
${agg}.service | XxxService | 定义聚合内相关领域服务接口 | |||
${agg}.service.impl | XxxServiceImpl | 定义聚合内相关领域服务接口实现 | |||
${agg}.service.statemachine | -- | 定义聚合的状态机实现 | |||
common.constants | -- | 定义应用域内的通用子域常量 | |||
common.utils | -- | 定义应用域内的通用子域工具 | |||
infrastructure | 基础设施层 | -- | -- | -- | -- |
acl | 应用防腐层 | ${package}.infra.acl | service | XxxServiceImpl | 定义防腐服务实现 |
repository | XxxRepositoryImpl | 定义领域仓储服务实现 | |||
converter | XxxConverter | 定义基础设施层对象到领域对象(实体、聚合、值对象)的转换器 | |||
producer | -- | 定义消息发送实现 | |||
cache | -- | 定义缓存服务实现 | |||
dal | 数据库访问层 | ${package}.infra.dal | dto | XxxDTO | 定义数据库访问层的dto |
mapper.auto | XxxMapper | 定义工具自动生成的mapper | |||
mapper.udf | XxxUdfMapper | 定义用户自定义的mapper | |||
po | XxxPO | 定义数据库表字段映射的的PO实体 | |||
integration | 业务系统集成层 | ${package}.infra.integration | ${inm} | XxxClient | 定义业务集成客户端 |
${inm}.impl | XxxClientImpl | 定义业务集成客户端实现 |