领域驱动 - 领域服务分层设计

文章目录

  • [领域驱动 - 领域服务分层设计](#领域驱动 - 领域服务分层设计)
    • [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 接口 :服务接口定义(如 PrimaryAccountQueryApiSecondaryAccountQueryApi
java 复制代码
// 示例:Command
public class PrimaryAccountMobileSignInCommand {
    private String mobile;
    private String smsCode;
}

1.2 xxx-user-interface(接口层)

职责:接收外部 HTTP 请求,进行参数校验,调用应用服务,返回响应结果。

包含内容

  • Controller :HTTP 入口(如 PrimaryAccountCommandControllerSecondaryAccountQueryController
  • 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-service
  • xxx-user-application-service:应用服务,依赖 domain 和 acl
  • xxx-user-domain:领域层,依赖 infrastructure(基础设施接口)
  • xxx-user-acl:防腐层,依赖 infrastructure
  • xxx-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 工程实例展示了:

  1. 六层模块划分:api、interface、application-service、domain、infrastructure、acl
  2. 清晰的依赖方向:接口层 → 应用服务 → 领域层 → 基础设施
  3. 按业务模块分包:primaryaccount、secondaryaccount 等
  4. 领域层内部分包:entity、service、factory、event、exception
相关推荐
Coder_Boy_2 个月前
基于SpringAI的在线考试系统-企业级教育考试系统核心架构(完善版)
开发语言·人工智能·spring boot·python·架构·领域驱动
Coder_Boy_2 个月前
基于SpringAI的在线考试系统-整体架构优化设计方案(续)
java·数据库·人工智能·spring boot·架构·领域驱动
Coder_Boy_2 个月前
基于SpringAI的在线考试系统-数据库设计核心业务方案(微调)
java·数据库·人工智能·spring boot·领域驱动
Coder_Boy_3 个月前
基于SpringAI的在线考试系统-试卷管理与考试管理模块联合回归测试文档
人工智能·spring boot·架构·领域驱动
Coder_Boy_3 个月前
基于SpringAI的在线考试系统-知识点管理与试题管理模块联合回归测试文档
前端·人工智能·spring boot·架构·领域驱动
Coder_Boy_3 个月前
基于SpringAI的在线考试系统-试卷管理模块完整优化方案
前端·人工智能·spring boot·架构·领域驱动
Coder_Boy_3 个月前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
ByteX3 个月前
DDD学习第7课CQRS与查询模型
领域驱动
职业码农NO.13 个月前
系统架构设计中的 15 个关键取舍
设计模式·架构·系统架构·ddd·架构师·设计规范·领域驱动