DDD 分层架构(现阶段大厂常用的架构):
DDD 分层架构 = 把代码按"业务本质"分层,核心目标:业务逻辑独立、不被技术污染、架构稳定。
DDD 官方经典四层架构(固定标准):
- 接口层(Interface/Presentation)
- 应用层(Application)
- 领域层(Domain)------核心核心核心
- 基础设施层(Infrastructure)
一、核心铁律(必须记住)
- 依赖方向:只能外层依赖内层,内层绝对不依赖外层
- 领域层 = 系统心脏,纯业务、无技术、不依赖任何外部框架
- 业务规则只允许写在领域层
二、每层职责(大白话+实战)
1. 接口层(Interface)
负责:对外接客
- 接收 HTTP/gRPC 请求
- Controller、DTO、入参校验、分页、封装返回
- 做DTO ↔ 领域对象 转换
- 不写任何业务逻辑
包名:controller、dto、assembler
2. 应用层(Application)
负责:流程编排,不做业务决策
- 协调领域对象、调用基础设施
- 处理事务、发送领域事件
- 只是**"组织步骤"**,不包含业务规则
例子:
创建订单流程:
- 校验商品
- 调用订单领域对象创建订单
- 扣库存
- 发送订单创建事件
应用层只负责"顺序",不负责"怎么算价格、能不能下单"等规则。
包名:application/service、application/event
3. 领域层(Domain)------DDD灵魂
全部都是业务本质,完全不依赖框架、DB、Redis
包含:
- 聚合根(Aggregate Root)
- 实体(Entity)
- 值对象(Value Object)
- 领域服务(Domain Service):跨实体业务逻辑
- 领域事件(Domain Event)
- 仓储接口(Repository Interface)(注意:只是接口,不实现)
所有业务规则都在这里:
- 订单价格怎么算
- 库存不足不能下单
- 优惠规则
- 状态流转(待支付 → 已支付 → 发货)
领域层:纯Java代码,无MyBatis、无Redis、无Spring!
4. 基础设施层(Infra)
负责:所有技术实现,为上层提供能力
- DB 操作(Mapper、DAO)
- 实现领域层的 Repository 接口
- Redis、MQ、第三方API调用
- 配置类、工具类
遵循依赖倒置:
- 领域定义接口
- 基础设施去实现
包名:infra/repository、infra/mapper、infra/client
三、依赖方向(一张图看懂)
|--------------------------------------------------------------------------|
| Plain Text 接口层 ↓ 应用层 ↓ 领域层 ←------------------ 核心,不依赖任何人 ↑ 基础设施层(实现领域接口) |
传统三层:Controller → Service → Dao
(Service 混杂业务+编排+技术,一团糟)
DDD四层:
业务全部收拢到 Domain,永远最稳定
四、实战项目包结构(最标准)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text com.xxx.order ├── controller # 接口层 ├── application # 应用层:编排、事务、事件 │ ├── service │ └── dto ├── domain # 领域层(核心) │ ├── entity # 聚合根、实体 │ ├── vo # 值对象 │ ├── service # 领域服务(业务规则) │ ├── repository # 仓储接口(只有方法签名) │ └── event # 领域事件 └── infra # 基础设施 ├── repository # 仓储实现 ├── mapper # MyBatis └── client # 第三方调用 |
五、一句话总结
- 接口层:接请求
- 应用层:排流程
- 领域层:写业务(核心)
- 基础设施层:做技术实现
DDD分层 = 业务与技术彻底分离,架构永不腐烂。