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

张开发
2026/4/19 23:56:39 15 分钟阅读

分享文章

领域驱动 - 领域服务分层设计
文章目录领域驱动 - 领域服务分层设计1. 前言1. 工程模块设计1.1 xxx-user-apiAPI 定义层1.2 xxx-user-interface接口层1.3 xxx-user-application-service应用服务层1.4 xxx-user-domain领域层1.5 xxx-user-infrastructure基础设施层1.6 xxx-user-acl防腐层/适配层2. 模块依赖关系2.1 xxx-user父工程2.2 xxx-user-api2.3 xxx-user-interface2.4 xxx-user-application-service2.5 xxx-user-domain2.6 xxx-user-infrastructure2.7 xxx-user-acl3. 模块依赖关系图4. 分包设计4.1 xxx-user-api 分包4.2 xxx-user-interface 分包4.3 xxx-user-application-service 分包4.4 xxx-user-domain 分包4.5 xxx-user-infrastructure 分包4.6 xxx-user-acl 分包5. 总结领域驱动 - 领域服务分层设计1. 前言领域驱动设计Domain-Driven DesignDDD是处理复杂业务领域的有效方法论。在工程落地时如何设计模块划分和分包结构是关键技术决策。本文以 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-apiAPI 定义层职责定义所有对外接口的请求对象和响应对象是接口层与应用服务层之间的契约。包含内容Command写操作的请求参数如PrimaryAccountMobileSignInCommandQuery读操作的请求参数如SecondaryAccountPageListQueryDTO数据传输对象如SecondaryAccountDTOApi 接口服务接口定义如PrimaryAccountQueryApi、SecondaryAccountQueryApi// 示例CommandpublicclassPrimaryAccountMobileSignInCommand{privateStringmobile;privateStringsmsCode;}1.2 xxx-user-interface接口层职责接收外部 HTTP 请求进行参数校验调用应用服务返回响应结果。包含内容ControllerHTTP 入口如PrimaryAccountCommandController、SecondaryAccountQueryControllerError Translator异常翻译将领域异常转换为 HTTP 响应// 示例Command ControllerRestControllerRequestMapping(/primaryaccount)publicclassPrimaryAccountCommandController{PostMapping(/signin/mobile)publicResponseEntitySignInDTOsignIn(RequestBodyValidPrimaryAccountMobileSignInCommandcmd){// 调用应用服务}}1.3 xxx-user-application-service应用服务层职责编排领域服务实现用例处理事务开启领域事件。包含内容Command Application Service处理写操作如PrimaryAccountCommandApplicationServiceQuery Application Service处理读操作如PrimaryAccountQueryApplicationService// 示例应用服务ServicepublicclassPrimaryAccountCommandApplicationService{AutowiredprivatePrimaryAccountDomainServicedomainService;AutowiredprivatePrimaryAccountRepositoryrepository;TransactionalpublicPrimaryAccountsignIn(PrimaryAccountMobileSignInCommandcmd){// 编排领域服务}}1.4 xxx-user-domain领域层职责承载核心业务逻辑是整个系统的核心包含实体、聚合根、领域服务、领域事件等。包含内容Entity实体如PrimaryAccountAggregate聚合根Value Object值对象Domain Service领域服务如PrimaryAccountDomainServiceFactory工厂如PrimaryAccountFactoryEvent领域事件event、listener、payload、publisher、sourceException领域异常// 示例领域服务publicclassPrimaryAccountDomainService{publicPrimaryAccountsignInByMobile(Stringmobile,StringsmsCode){// 核心业务逻辑}}1.5 xxx-user-infrastructure基础设施层职责提供技术实现包括数据库持久化、配置管理、通用工具类等。包含内容Repository仓储实现如PrimaryAccountRepositoryImplConfig配置类Util工具类Common公共组件如审计日志AuditLog1.6 xxx-user-acl防腐层/适配层职责隔离外部依赖将外部服务如认证服务、短信服务转换为内部接口。包含内容Auth认证门面如AuthAdapterBot第三方服务如短信验证码SmsCodeBotAdapterRole角色服务// 示例防腐层接口publicinterfaceAuthAdapter{AuthTokenResultgetToken(AuthTokenParamparam);}2. 模块依赖关系2.1 xxx-user父工程?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.xxx/groupIdartifactIdxxx-user/artifactIdversion1.0.0-SNAPSHOT/versionpackagingpom/packagingmodulesmodulexxx-user-infrastructure/modulemodulexxx-user-api/modulemodulexxx-user-acl/modulemodulexxx-user-domain/modulemodulexxx-user-application-service/modulemodulexxx-user-interface/module/modules/project2.2 xxx-user-api?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-api/artifactIdversion1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdcom.xxx/groupIdartifactIdxxx-user-infrastructure/artifactIdversion1.0.0-SNAPSHOT/versionscopeprovided/scope/dependency/dependencies/project2.3 xxx-user-interface?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-interface/artifactIdversion1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdcom.xxx/groupIdartifactIdxxx-user-api/artifactIdversion1.0.0-SNAPSHOT/version/dependencydependencygroupIdcom.xxx/groupIdartifactIdxxx-user-application-service/artifactIdversion1.0.0-SNAPSHOT/version/dependency/dependenciesbuildfinalNamexxx-user-server/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.3.4.RELEASE/versionconfigurationmainClasscom.xxx.user.UserApplication/mainClass/configurationexecutionsexecutiongoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build/project2.4 xxx-user-application-service?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-application-service/artifactIdversion1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdcom.xxx/groupIdartifactIdxxx-user-domain/artifactIdversion1.0.0-SNAPSHOT/version/dependencydependencygroupIdcom.xxx/groupIdartifactIdxxx-user-acl/artifactIdversion1.0.0-SNAPSHOT/version/dependency/dependencies/project2.5 xxx-user-domain?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-domain/artifactIdversion1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdcom.xxx/groupIdartifactIdxxx-user-infrastructure/artifactIdversion1.0.0-SNAPSHOT/version/dependency/dependencies/project2.6 xxx-user-infrastructure?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-infrastructure/artifactIdversion1.0.0-SNAPSHOT/version/project2.7 xxx-user-acl?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIdxxx-user-acl/artifactIdversion1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdcom.xxx/groupIdartifactIdxxx-user-infrastructure/artifactIdversion1.0.0-SNAPSHOT/version/dependency/dependencies/project3. 模块依赖关系图xxx-user-interfacexxx-user-apixxx-user-application-servicexxx-user-domainxxx-user-aclxxx-user-infrastructure依赖方向说明xxx-user-interface入口层依赖 api 和 application-servicexxx-user-application-service应用服务依赖 domain 和 aclxxx-user-domain领域层依赖 infrastructure基础设施接口xxx-user-acl防腐层依赖 infrastructurexxx-user-apiAPI 定义层依赖 infrastructureprovided4. 分包设计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

更多文章