Appearance
目标: 将现有代码逐步迁移到标准DDD分层结构
现状分析
当前项目模块:
soms-service/
├── soms-service-application/ 57个文件(仅消息处理器等)
├── soms-service-domain/ 362个文件(包含Repository实现)
├── soms-service-infrastructure/ 267个文件
├── soms-service-common/ 少量通用文件
└── soms-service-start/ 1337个文件
├── application/ 应用服务
├── domain/ 领域逻辑
├── userinterface/ 用户接口
├── helper/ 工具类
├── constant/ 常量(146个文件)
└── infrastructure/ 基础设施初步分析建议:
- 1、考虑添加一下模块:soms-service-adapter/ <-- web controller、API 接口、DTO 转换
- 2、soms-service-infrastructure 目前放置了实体类和部分网关接口,可以考虑将 domian 模块下 的Repository实现、Tunnel 放在infrastructure
- 3、模块 application 没有正确使用起来,职责有些分散,目前application服务分散在start和 application 两个模块
- 4、需要将 start 模块下的文件逐步迁移到其他模块下,仅保留启动类和配置
目标架构
soms-service/
├── soms-service-adapter/ Controller, DTO, RPC, MQ Consumer
├── soms-service-application/ AppService, Assembler, Event
├── soms-service-domain/ Model, Repository接口, DomainService
├── soms-service-infrastructure/ RepositoryImpl, Gateway, Mapper, PO
├── soms-service-common/ 通用常量、工具、枚举
└── soms-service-start/ 仅启动类和配置分层架构开发规范
┌─────────────────────────────────────────────────────────┐
│ Adapter Layer │
│ (用户接口层 - 对外暴露接口,适配外部请求) │
│ - Web Controller / RPC Service / MQ Consumer │
└─────────────────┬───────────────────────────────────────┘
│ 调用
↓
┌─────────────────────────────────────────────────────────┐
│ Application Layer │
│ (应用层 - 业务流程编排,跨聚合协调) │
│ - Application Service / Event Publisher │
└─────────────────┬───────────────────────────────────────┘
│ 调用
↓
┌─────────────────────────────────────────────────────────┐
│ Domain Layer │
│ (领域层 - 核心业务逻辑,聚合根,领域规则) │
│ - Entity / Value Object / Domain Service / Repository │
└─────────────────┬───────────────────────────────────────┘
│ 接口定义
↓ 接口实现(依赖倒置)
┌─────────────────────────────────────────────────────────┐
│ Infrastructure Layer │
│ (基础设施层 - 技术实现,外部系统集成) │
│ - Repository Impl / Gateway / MQ Producer / Cache │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────┐
│ Common Layer │
│ (公共层 - 通用工具,常量) │
└─────────────────────────────┘模块职责定义
| 模块 | 职责 | 包含内容 | 禁止内容 |
|---|---|---|---|
| soms-service-adapter | 用户接口层/适配器层 对外暴露服务接口、请求转换、参数校验 | - Web Controller (REST接口) - RPC Service 实现 - MQ Consumer - WebSocket Handler - 接口DTO (Request/Response) - DTO Convertor (接口DTO↔应用DTO) | ❌业务逻辑实现 ❌直接调用Domain Service ❌直接操作数据库 ❌直接调用外部系统 |
| soms-service-application | 应用层 业务用例编排、事务、事件发布、权限检查 | - Application Service (应用服务) - Application DTO - Assembler (DTO↔Domain) - Event Publisher/Subscriber | ❌核心领域逻辑 ❌技术实现细节 ❌接口细节 |
| soms-service-domain | 领域层 核心业务逻辑、领域规则、聚合管理、事件定义 | - Entity - Value Object - Aggregate Root - Domain Service - Repository接口 - Domain Event - Factory - Specification - Policy | ❌Repository实现类 ❌MyBatis/JPA Entity ❌外部调用 ❌Spring注解(除领域服务) ❌Tunnel/Gateway实现 ❌DTO |
| soms-service-infrastructure | 基础设施层 接口实现、外部集成、持久化、技术工具 | - Repository实现类 - Mapper/Repository - PO - Gateway实现 - MQ Producer - Cache实现 - 技术配置类 - 工具类 | ❌业务逻辑 ❌领域规则 |
| soms-service-common | 公共层 通用能力、工具 | - 通用常量 - 通用枚举 - 通用异常 - 通用工具类 - 通用注解 | ❌业务常量 ❌业务枚举 ❌业务工具类 |
| soms-service-start | 启动层 应用启动与全局配置 | - Application.java - 配置类 - application.yml/properties | ❌application/应用服务 ❌domain/领域逻辑 ❌userinterface/接口 ❌helper/工具 ❌constant/常量 ❌任何业务代码 |
标准包结构
soms-service-adapter 包结构
soms-service-adapter/
└── src/main/java/com/shein/somsservice/adapter/
├── web/ # Web适配器
│ ├── controller/ # REST控制器
│ │ ├── PlatformActivityController.java
│ │ └── SelfActivityController.java
│ ├── dto/ # 接口DTO
│ │ ├── request/ # 请求DTO
│ │ │ ├── CreateActivityRequest.java
│ │ │ └── UpdateActivityRequest.java
│ │ └── response/ # 响应DTO
│ │ ├── ActivityDetailResponse.java
│ │ └── ActivityListResponse.java
│ ├── convertor/ # DTO转换器
│ │ └── ActivityWebConvertor.java # Request/Response ↔ AppDTO
│ └── filter/ # Web过滤器
│ └── AuthFilter.java
├── rpc/ # RPC适配器
│ ├── service/ # RPC服务实现
│ │ └── ActivityRpcServiceImpl.java
│ └── dto/ # RPC DTO
├── mq/ # 消息队列消费者
│ ├── consumer/ # 消费者
│ │ └── ActivityMessageConsumer.java
│ └── dto/ # 消息DTO
│ └── ActivityMessageDTO.java
└── job/ # 定时任务
└── ActivitySyncJob.javasoms-service-application 包结构
soms-service-application/
└── src/main/java/com/shein/somsservice/application/
├── service/ # 应用服务
│ ├── PlatformActivityAppService.java # 平台活动应用服务
│ └── SelfActivityAppService.java # 自营活动应用服务
├── dto/ # 应用层DTO
│ ├── ActivityAppDTO.java
│ └── ProductAppDTO.java
├── assembler/ # 组装器
│ └── ActivityAssembler.java # AppDTO ↔ Domain Object
└── event/ # 应用事件
├── publisher/ # 事件发布器
│ └── ActivityEventPublisher.java
└── subscriber/ # 事件订阅器
└── ActivityEventSubscriber.javasoms-service-domain 包结构
soms-service-domain/
└── src/main/java/com/shein/somsservice/domain/
├── platformactivity/ # 聚合根:平台活动
│ ├── entity/ # 实体
│ │ ├── PlatformActivity.java # 聚合根
│ │ └── ActivityProduct.java # 实体
│ ├── valueobject/ # 值对象
│ │ ├── ActivityTime.java
│ │ └── DiscountRate.java
│ ├── service/ # 领域服务
│ │ ├── PlatformActivityDomainService.java # 接口
│ │ └── impl/
│ │ └── PlatformActivityDomainServiceImpl.java
│ ├── repository/ # 仓储接口
│ │ └── PlatformActivityRepository.java # ⚠️ 只有接口,无impl
│ ├── factory/ # 工厂
│ │ └── PlatformActivityFactory.java
│ ├── specification/ # 规约
│ │ └── ActivityValidSpecification.java
│ └── event/ # 领域事件
│ └── ActivityCreatedEvent.java
├── selfactivity/ # 聚合根:自营活动
│ └── ... (同上结构)
└── shared/ # 共享领域概念
├── constant/ # 领域常量
│ └── ActivityStatus.java
├── enums/ # 领域枚举
│ └── ActivityType.java
└── exception/ # 领域异常
└── ActivityBusinessException.javasoms-service-infrastructure 包结构
soms-service-infrastructure/
└── src/main/java/com/shein/somsservice/infrastructure/
├── persistence/ # 持久化
│ ├── dataobject/ # 数据对象(PO)
│ │ ├── PlatformActivityPO.java
│ │ └── ActivityProductPO.java
│ ├── mapper/ # MyBatis Mapper
│ │ └── PlatformActivityMapper.java
│ ├── repository/ # 仓储实现
│ │ └── impl/
│ │ └── PlatformActivityRepositoryImpl.java # ✅ 实现Domain接口
│ ├── convertor/ # PO转换器
│ │ └── ActivityPersistenceConvertor.java # PO ↔ Entity
│ └── typehandler/ # 类型处理器
│ └── JsonTypeHandler.java
├── gateway/ # 外部服务网关(防腐层)
│ ├── plm/ # PLM系统网关
│ │ ├── PlmGateway.java # 网关接口(可选)
│ │ ├── PlmGatewayImpl.java # 网关实现
│ │ ├── client/ # 外部客户端
│ │ │ └── PlmClient.java
│ │ ├── request/ # 外部请求对象
│ │ │ └── PlmProductRequest.java
│ │ ├── response/ # 外部响应对象
│ │ │ └── PlmProductResponse.java
│ │ └── convertor/ # 防腐转换器
│ │ └── PlmDomainConvertor.java # 外部对象 ↔ Domain对象
│ ├── ppc/ # PPC系统网关
│ │ └── ... (同上结构)
│ └── spfm/ # SPFM系统网关
│ └── ... (同上结构)
├── mq/ # 消息队列基础设施
│ ├── producer/ # 生产者
│ │ └── ActivityEventProducer.java
│ └── config/ # MQ配置
│ └── KafkaProducerConfig.java
├── cache/ # 缓存实现
│ ├── ActivityCacheManager.java
│ └── config/
│ └── RedisConfig.java
├── config/ # 基础设施配置
│ ├── DataSourceConfig.java
│ └── ThreadPoolConfig.java
└── utils/ # 基础设施工具类
├── TransactionUtils.java
└── BatchHelper.javasoms-service-common 包结构
soms-service-common/
└── src/main/java/com/shein/somsservice/common/
├── constant/ # 通用常量
│ └── CommonConstants.java
├── enums/ # 通用枚举
│ └── YesNoEnum.java
├── exception/ # 通用异常
│ ├── BaseException.java
│ └── SystemException.java
├── util/ # 通用工具类
│ ├── DateUtil.java
│ ├── StringUtil.java
│ └── JsonUtil.java
└── annotation/ # 通用注解
└── Trace.javasoms-service-start 包结构
soms-service-start/
├── src/main/java/com/shein/somsservice/
│ ├── Application.java # ✅ 启动类
│ └── config/ # ✅ 全局配置
│ ├── GlobalExceptionHandler.java
│ └── SwaggerConfig.java
└── src/main/resources/
├── application.yml # ✅ 配置文件
├── application-dev.yml
├── application-prod.yml
└── logback-spring.xml常见的数据对象类型定义
| 名称 | 所属层次 | 用途/定义 | 数据注解 | 是否包含业务逻辑 | 与数据库映射关系 |
|---|---|---|---|---|---|
| Entity(实体) | domain(领域层) | 表达核心业务对象,有唯一业务标识,封装业务规则与行为 | 领域相关注解(少量) | 有(核心业务规则) | 无 |
| Value Object(值对象) | domain(领域层) | 一组不可分割的属性,无唯一标识,业务不可变值 | 无 | 有(只读、不可变) | 无 |
| DTO(数据传输对象) | application/interface/adaptor(应用、接口、适配层) | 系统间或前后端数据交换、参数传递 | 校验或序列化注解(可选) | 无 | 可能有/无 |
| PO(持久化对象) | infrastructure(基础设施/持久化层) | 数据库存储对象,与表字段一一映射,做数据持久化 | ORM/数据库相关注解 | 无 | 一一映射数据库表 |
| Model(模型类) | 多义,各层次均可能出现 | ①页面模型 ②接口交互模型 ③临时/业务模型等 | 项目相关配置 | 通常无(视场景而定) | 依项目而异 |
分层开发规范
| 层级 | 规范对象 | 主要职责与规范 | 禁止/注意事项 |
|---|---|---|---|
| Adapter | Controller | - 接收/响应 HTTP 请求 - 参数校验 - 调用应用服务 - DTO转换 | 禁止写业务逻辑 禁止直接操作数据库/领域服务 |
| DTO | - 面向接口设计 - 基础类型、校验注解 - 数据交互载体 | 不包含业务逻辑 | |
| Application | Application Service | - 业务流程编排 - 跨聚合协调 - 事务管理 - DTO ↔ 领域对象转换 - 应用事件 | 禁止核心业务逻辑 禁止直连DB/外部系统 |
| Assembler | - 负责 DTO 与领域模型互转 | 仅做字段/结构映射,不包含复杂逻辑 | |
| Domain | Entity | - 聚合根 - 业务逻辑实现 - 状态维护/不变性 | 禁止贫血模型 禁止暴露基础 setter 绕业务规则 |
| Value Object | - 不可变 - 业务属性封装 - 内部校验与只读业务逻辑 | 无 ID,不可变,不含持久化注解 | |
| Domain Service | - 跨实体业务 - 领域规则(无法归属单一实体) - 可依赖仓储 - 无状态 | 禁止技术实现细节 禁止外部系统直接调用 | |
| Repository Interface | - 领域对象持久化接口 - 领域语义方法签名 - 面向实体/聚合 | 仅定义接口,不含实现 参数/返回值用领域对象 | |
| Infrastructure | Repository Impl | - 实现 Repository 接口 - Entity ↔ PO 映射 - DB 操作细节 | 不掺杂业务逻辑 通过注解声明 |
| Gateway | - 外部系统调用适配、反腐封装 - 外部模型转领域模型 - 处理异常 | 禁止领域污染 实现细节只在基础设施层 |
依赖关系规范
| 层/模块 | 允许依赖 | 禁止依赖 | 依赖说明 |
|---|---|---|---|
| Adapter | Application, Common | Domain, Infrastructure | 仅依赖应用编排层和通用工具,不直连领域/持久化层 |
| Application | Domain, Common | Adapter, Infrastructure | 只依赖领域模型和通用工具,不能降级/跳跃依赖 |
| Domain | Common, 基础框架(如Spring 可provided) | Application, Infrastructure, Adapter, 技术框架(如MyBatis/Redis) | 核心业务模型,最大程度解耦,仅实现领域本身 |
| Infrastructure | Domain(实现接口), Common, 技术框架 | Application, Adapter | 仅连接领域接口,持久化/网关/外部集成相关依赖 |
| Common | 无限制/基础依赖库 | 无 | 所有层都可依赖的通用模块,放工具/常量等 |
| Start/启动模块 | 所有层 | 无 | 汇总依赖各业务层与基础设施层 |
命名规范
各层DTO与对象转换规范
迁移计划
迁移规范
- 1、逐步迁移,从下往上迁移,分阶段迁移,迁移后需要回归验证。
- 2、新功能严格按照新结构开发
- 3、迁移期间保持系统稳定,老代码逐步重构
迁移阶段
第一阶段: Infrastructure层(Repository实现、Tunnel)
↓第二阶段: Domain层纯化
↓第三阶段: Application层整合
↓第四阶段: Adapter层激活
↓第五阶段: Start层瘦身迁移策略
新老并存
java
// 1. 创建新位置的类
infrastructure/persistence/repository/impl/PlatformActivityRepositoryImpl.java
// 2. 老位置标记为@Deprecated
@Deprecated
domain/platformactivity/repository/impl/PlatformActivityRepositoryMpImpl.java
// 3. 老类委托给新类
@Deprecated
public class PlatformActivityRepositoryMpImpl implements PlatformActivityRepository {
@Autowired private PlatformActivityRepositoryImpl newImpl;
public Optional<PlatformActivity> findById(Long id) { return newImpl.findById(id); // 委托给新实现
}}
// 4. 逐步迁移调用方
// 5. 删除老类迁移任务
| 阶段 | 目标/里程碑 | 关键任务与操作 | 迁移/重构对象示例 | 验收标准(关键勾选项) |
|---|---|---|---|---|
| 0 | 准备与基础设施搭建 | 制定规范文档、迁移指引、代码清单、ArchUnit用例、团队培训 | 文档、测试用例、代码清单 | |
| 1 | Infrastructure 层迁移与领域纯化 | Repository 实现迁移,Tunnel → Gateway,Convertor梳理 | RepositoryMpImpl、Tunnel、Convertor | ☐ Domain 层无 Repository 实现类 ☐ Tunnel 类剥离 ☐ 测试通过 |
| 2 | Adapter 层接管接口 | Adapter 模块搭建,Controller/DTO 迁移 | Controller、Request/Response DTO | ☐ Adapter 层覆盖所有 Controller ☐ Controller 只依赖 Application 层 ☐ 测试通过 |
| 3 | Application 层整合优化 | AppService 迁移,DTO 梳理,Assembler 创建 | Application Service、AppDTO、Assembler | ☐ 所有功能均由 AppService 管理 ☐ Assembler 解耦数据转换 ☐ AppService 无业务逻辑 ☐ 测试通过 |
| 4 | Domain 层重构与聚合建模 | Service/Repository迁移归类,聚合根重组,实体充血化 | Domain Service、Aggregates、Entity | ☐ 聚合根结构合理 ☐ Entity 具备业务方法 ☐ 无技术依赖 ☐ 测试通过 |
| 5 | 工具类与常量规范 | Helper/Util 类及业务常量、枚举梳理归类 | Helper、Constant、Enums | ☐ 工具类/常量目录清理 ☐ 分类归类规范 |
| 6 | 启动层优化与收口 | 清理无关代码,仅保留启动和全局配置,迁移 DataSource 等 | Application、配置、辅助类 | ☐ 仅剩启动类及核心配置 ☐ 文件数量 < 20 ☐ 应用可正常启动 |
输出内容
- DDD 分层规范文档
- Skills 功能模块迁移
- claude.md 编写规范文档
- 项目分层结构清晰,完全符合 DDD 设计原则