文章目录
- [领域驱动 - 领域服务分层设计](#领域驱动 - 领域服务分层设计)
-
- [1. 前言](#1. 前言)
- [1. 工程模块设计](#1. 工程模块设计)
-
- [1.1 xxx-user-api(API 定义层)](#1.1 xxx-user-api(API 定义层))
- [1.2 xxx-user-interface(接口层)](#1.2 xxx-user-interface(接口层))
- [1.3 xxx-user-application-service(应用服务层)](#1.3 xxx-user-application-service(应用服务层))
- [1.4 xxx-user-domain(领域层)](#1.4 xxx-user-domain(领域层))
- [1.5 xxx-user-infrastructure(基础设施层)](#1.5 xxx-user-infrastructure(基础设施层))
- [1.6 xxx-user-acl(防腐层/适配层)](#1.6 xxx-user-acl(防腐层/适配层))
- [2. 模块依赖关系](#2. 模块依赖关系)
-
- [2.1 xxx-user(父工程)](#2.1 xxx-user(父工程))
- [2.2 xxx-user-api](#2.2 xxx-user-api)
- [2.3 xxx-user-interface](#2.3 xxx-user-interface)
- [2.4 xxx-user-application-service](#2.4 xxx-user-application-service)
- [2.5 xxx-user-domain](#2.5 xxx-user-domain)
- [2.6 xxx-user-infrastructure](#2.6 xxx-user-infrastructure)
- [2.7 xxx-user-acl](#2.7 xxx-user-acl)
- [3. 模块依赖关系图](#3. 模块依赖关系图)
- [4. 分包设计](#4. 分包设计)
-
- [4.1 xxx-user-api 分包](#4.1 xxx-user-api 分包)
- [4.2 xxx-user-interface 分包](#4.2 xxx-user-interface 分包)
- [4.3 xxx-user-application-service 分包](#4.3 xxx-user-application-service 分包)
- [4.4 xxx-user-domain 分包](#4.4 xxx-user-domain 分包)
- [4.5 xxx-user-infrastructure 分包](#4.5 xxx-user-infrastructure 分包)
- [4.6 xxx-user-acl 分包](#4.6 xxx-user-acl 分包)
- [5. 总结](#5. 总结)
领域驱动 - 领域服务分层设计
1. 前言
领域驱动设计(Domain-Driven Design,DDD)是处理复杂业务领域的有效方法论。在工程落地时,如何设计模块划分和分包结构是关键技术决策。本文以 xxx-user 工程为例,介绍领域驱动设计在工程实践中的模块与分包设计。
1. 工程模块设计
xxx-user(父工程)
├── xxx-user-api # API 定义层
├── xxx-user-interface # 接口层(Controller)
├── xxx-user-application-service # 应用服务层
├── xxx-user-domain # 领域层
├── xxx-user-infrastructure # 基础设施层
└── xxx-user-acl # 防腐层
1.1 xxx-user-api(API 定义层)
职责:定义所有对外接口的请求对象和响应对象,是接口层与应用服务层之间的契约。
包含内容:
- Command :写操作的请求参数(如
PrimaryAccountMobileSignInCommand) - Query :读操作的请求参数(如
SecondaryAccountPageListQuery) - DTO :数据传输对象(如
SecondaryAccountDTO) - Api 接口 :服务接口定义(如
PrimaryAccountQueryApi、SecondaryAccountQueryApi)
java
// 示例:Command
public class PrimaryAccountMobileSignInCommand {
private String mobile;
private String smsCode;
}
1.2 xxx-user-interface(接口层)
职责:接收外部 HTTP 请求,进行参数校验,调用应用服务,返回响应结果。
包含内容:
- Controller :HTTP 入口(如
PrimaryAccountCommandController、SecondaryAccountQueryController) - Error Translator:异常翻译(将领域异常转换为 HTTP 响应)
java
// 示例:Command Controller
@RestController
@RequestMapping("/primaryaccount")
public class PrimaryAccountCommandController {
@PostMapping("/signin/mobile")
public ResponseEntity<SignInDTO> signIn(@RequestBody @Valid PrimaryAccountMobileSignInCommand cmd) {
// 调用应用服务
}
}
1.3 xxx-user-application-service(应用服务层)
职责:编排领域服务,实现用例,处理事务,开启领域事件。
包含内容:
- Command Application Service :处理写操作(如
PrimaryAccountCommandApplicationService) - Query Application Service :处理读操作(如
PrimaryAccountQueryApplicationService)
java
// 示例:应用服务
@Service
public class PrimaryAccountCommandApplicationService {
@Autowired private PrimaryAccountDomainService domainService;
@Autowired private PrimaryAccountRepository repository;
@Transactional
public PrimaryAccount signIn(PrimaryAccountMobileSignInCommand cmd) {
// 编排领域服务
}
}
1.4 xxx-user-domain(领域层)
职责:承载核心业务逻辑,是整个系统的核心,包含实体、聚合根、领域服务、领域事件等。
包含内容:
- Entity :实体(如
PrimaryAccount) - Aggregate:聚合根
- Value Object:值对象
- Domain Service :领域服务(如
PrimaryAccountDomainService) - Factory :工厂(如
PrimaryAccountFactory) - Event:领域事件(event、listener、payload、publisher、source)
- Exception:领域异常
java
// 示例:领域服务
public class PrimaryAccountDomainService {
public PrimaryAccount signInByMobile(String mobile, String smsCode) {
// 核心业务逻辑
}
}
1.5 xxx-user-infrastructure(基础设施层)
职责:提供技术实现,包括数据库持久化、配置管理、通用工具类等。
包含内容:
- Repository :仓储实现(如
PrimaryAccountRepositoryImpl) - Config:配置类
- Util:工具类
- Common :公共组件(如审计日志
AuditLog)
1.6 xxx-user-acl(防腐层/适配层)
职责:隔离外部依赖,将外部服务(如认证服务、短信服务)转换为内部接口。
包含内容:
- Auth :认证门面(如
AuthAdapter) - Bot :第三方服务(如短信验证码
SmsCodeBotAdapter) - Role:角色服务
java
// 示例:防腐层接口
public interface AuthAdapter {
AuthTokenResult getToken(AuthTokenParam param);
}
2. 模块依赖关系
2.1 xxx-user(父工程)
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>xxx-user</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>xxx-user-infrastructure</module>
<module>xxx-user-api</module>
<module>xxx-user-acl</module>
<module>xxx-user-domain</module>
<module>xxx-user-application-service</module>
<module>xxx-user-interface</module>
</modules>
</project>
2.2 xxx-user-api
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-infrastructure</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
2.3 xxx-user-interface
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-application-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>xxx-user-server</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.4.RELEASE</version>
<configuration>
<mainClass>com.xxx.user.UserApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.4 xxx-user-application-service
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-application-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-domain</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-acl</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2.5 xxx-user-domain
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-domain</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-infrastructure</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2.6 xxx-user-infrastructure
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-infrastructure</artifactId>
<version>1.0.0-SNAPSHOT</version>
</project>
2.7 xxx-user-acl
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-user-acl</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx-user-infrastructure</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3. 模块依赖关系图
xxx-user-interface
xxx-user-api
xxx-user-application-service
xxx-user-domain
xxx-user-acl
xxx-user-infrastructure
依赖方向说明:
xxx-user-interface:入口层,依赖 api 和 application-servicexxx-user-application-service:应用服务,依赖 domain 和 aclxxx-user-domain:领域层,依赖 infrastructure(基础设施接口)xxx-user-acl:防腐层,依赖 infrastructurexxx-user-api:API 定义层,依赖 infrastructure(provided)
4. 分包设计
4.1 xxx-user-api 分包
xxx-user-api/src/main/java/com/xxx/user/api/
├── primaryaccount/
│ ├── command/ # 主账户 Command
│ ├── query/ # 主账户 Query
│ ├── dto/ # 主账户 DTO
│ └── PrimaryAccountQueryApi.java
├── secondaryaccount/
│ ├── api/ # 子账户 Api 接口
│ ├── command/ # 子账户 Command
│ ├── query/ # 子账户 Query
│ └── dto/ # 子账户 DTO
└── XxxUser.java # 统一入口
4.2 xxx-user-interface 分包
xxx-user-interface/src/main/java/com/xxx/user/interfaces/
├── primaryaccount/
│ ├── command/ # 主账户 Controller
│ └── query/ # 主账户 Query Controller
├── secondaryaccount/
│ ├── command/ # 子账户 Controller
│ └── query/ # 子账户 Query Controller
├── common/
│ └── error/ # 全局异常翻译
└── UserApplication.java # 启动类
4.3 xxx-user-application-service 分包
xxx-user-application-service/src/main/java/com/xxx/user/applicationservice/
├── primaryaccount/
│ ├── command/ # 主账户应用服务
│ └── query/ # 主账户查询应用服务
├── secondaryaccount/
│ ├── command/ # 子账户应用服务
│ └── query/ # 子账户查询应用服务
├── auditlog/ # 审计日志应用服务
└── operator/ # 操作员应用服务
4.4 xxx-user-domain 分包
xxx-user-domain/src/main/java/com/xxx/user/domain/
├── primaryaccount/
│ ├── entity/ # 主账户实体
│ ├── bo/ # 业务对象
│ ├── service/ # 主账户领域服务
│ ├── factory/ # 主账户工厂
│ └── exception/ # 主账户领域异常
├── secondaryaccount/
│ ├── entity/ # 子账户实体
│ ├── bo/ # 业务对象
│ ├── service/ # 子账户领域服务
│ ├── factory/ # 子账户工厂
│ └── exception/ # 子账户领域异常
└── account/ # 账户通用(如事件)
4.5 xxx-user-infrastructure 分包
xxx-user-infrastructure/src/main/java/com/xxx/user/infrastructure/
├── repository/ # 仓储实现
├── config/ # 配置类
├── common/
│ └── auditlog/ # 审计日志组件
│ ├── annotation/
│ ├── aspect/
│ ├── entity/
│ ├── enums/
│ └── service/
└── util/ # 工具类
4.6 xxx-user-acl 分包
xxx-user-acl/src/main/java/com/xxx/user/acl/
├── auth/ # 认证防腐层
│ ├── impl/ # 认证实现
│ ├── param/ # 参数对象
│ ├── result/ # 结果对象
│ └── enums/ # 枚举
├── bot/ # 第三方服务(短信)
│ └── impl/
├── role/ # 角色服务
└── accountrole/ # 账户角色
5. 总结
本文介绍了基于领域驱动设计的工程模块与分包设计,通过 xxx-user 工程实例展示了:
- 六层模块划分:api、interface、application-service、domain、infrastructure、acl
- 清晰的依赖方向:接口层 → 应用服务 → 领域层 → 基础设施
- 按业务模块分包:primaryaccount、secondaryaccount 等
- 领域层内部分包:entity、service、factory、event、exception