适用场景: 中小型项目,单一限界上下文,需要清晰的技术隔离
order-service/ # 订单服务(单体应用)
├── 📁 src/
│ ├── 📁 main/
│ │ ├── 📁 java/io/ddd4j/order/
│ │ │ │
│ │ │ ├── 📁 application/ # 应用层(用例层)
│ │ │ │ ├── 📁 ports/ # 端口定义(接口)
│ │ │ │ │ ├── 📁 inbound/ # 入站端口(驱动端)
│ │ │ │ │ │ ├── IOrderService.java # 订单服务端口
│ │ │ │ │ │ │ ├── createOrder(CreateOrderCmd): OrderId
│ │ │ │ │ │ │ ├── getOrder(OrderId): Order
│ │ │ │ │ │ │ └── cancelOrder(OrderId): void
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── ICustomerService.java # 客户服务端口
│ │ │ │ │ │ └── IPaymentService.java # 支付服务端口
│ │ │ │ │ │
│ │ │ │ │ └── 📁 outbound/ # 出站端口(被驱动端)
│ │ │ │ │ ├── IOrderRepository.java # 订单仓储端口
│ │ │ │ │ │ ├── save(Order): void
│ │ │ │ │ │ ├── findById(OrderId): Order
│ │ │ │ │ │ └── findByCustomer(CustomerId): List<Order>
│ │ │ │ │ │
│ │ │ │ │ ├── ICustomerRepository.java # 客户仓储端口
│ │ │ │ │ ├── IProductRepository.java # 产品仓储端口
│ │ │ │ │ │
│ │ │ │ │ ├── IPaymentProvider.java # 支付提供商端口
│ │ │ │ │ │ └── processPayment(PaymentInfo): PaymentResult
│ │ │ │ │ │
│ │ │ │ │ ├── INotificationService.java # 通知服务端口
│ │ │ │ │ └── IEventPublisher.java # 事件发布端口
│ │ │ │ │
│ │ │ │ ├── 📁 services/ # 应用服务实现
│ │ │ │ │ ├── OrderServiceImpl.java # 实现IOrderService
│ │ │ │ │ │ ├── @Service
│ │ │ │ │ │ └── implements IOrderService
│ │ │ │ │ │
│ │ │ │ │ ├── CustomerServiceImpl.java # 实现ICustomerService
│ │ │ │ │ └── PaymentServiceImpl.java # 实现IPaymentService
│ │ │ │ │
│ │ │ │ ├── 📁 usecases/ # 具体用例
│ │ │ │ │ ├── 📁 order/ # 订单用例
│ │ │ │ │ │ ├── CreateOrderUseCase.java
│ │ │ │ │ │ │ ├── execute(CreateOrderCmd): OrderId
│ │ │ │ │ │ │ └── validate(CreateOrderCmd): void
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── ProcessOrderUseCase.java
│ │ │ │ │ │ └── CancelOrderUseCase.java
│ │ │ │ │ │
│ │ │ │ │ ├── 📁 customer/ # 客户用例
│ │ │ │ │ │ ├── RegisterCustomerUseCase.java
│ │ │ │ │ │ └── ValidateCustomerUseCase.java
│ │ │ │ │ │
│ │ │ │ │ └── 📁 dto/ # 用例DTO
│ │ │ │ │ ├── CreateOrderCmd.java
│ │ │ │ │ ├── OrderDTO.java
│ │ │ │ │ └── PaymentDTO.java
│ │ │ │ │
│ │ │ │ └── 📁 exception/ # 应用层异常
│ │ │ │ ├── ApplicationException.java
│ │ │ │ ├── ValidationException.java
│ │ │ │ └── BusinessRuleException.java
│ │ │ │
│ │ │ ├── 📁 domain/ # 领域层(核心业务逻辑)
│ │ │ │ ├── 📁 model/ # 领域模型/实体
│ │ │ │ │ ├── Order.java # 订单聚合根
│ │ │ │ │ │ ├── OrderId
│ │ │ │ │ │ ├── CustomerId
│ │ │ │ │ │ ├── List<OrderItem>
│ │ │ │ │ │ ├── OrderStatus
│ │ │ │ │ │ ├── Money
│ │ │ │ │ │ ├── place()
│ │ │ │ │ │ ├── pay()
│ │ │ │ │ │ └── cancel()
│ │ │ │ │ │
│ │ │ │ │ ├── OrderItem.java # 订单项
│ │ │ │ │ ├── Customer.java # 客户实体
│ │ │ │ │ └── Product.java # 产品实体
│ │ │ │ │
│ │ │ │ ├── 📁 valueobject/ # 值对象
│ │ │ │ │ ├── OrderId.java
│ │ │ │ │ ├── CustomerId.java
│ │ │ │ │ ├── Money.java
│ │ │ │ │ │ ├── amount: BigDecimal
│ │ │ │ │ │ ├── currency: Currency
│ │ │ │ │ │ ├── add(Money): Money
│ │ │ │ │ │ └── equals(): boolean
│ │ │ │ │ │
│ │ │ │ │ ├── Email.java
│ │ │ │ │ ├── PhoneNumber.java
│ │ │ │ │ ├── Address.java
│ │ │ │ │ └── Quantity.java
│ │ │ │ │
│ │ │ │ ├── 📁 event/ # 领域事件
│ │ │ │ │ ├── DomainEvent.java # 基础事件接口
│ │ │ │ │ │ ├── occurredOn(): Instant
│ │ │ │ │ │ └── getAggregateId(): String
│ │ │ │ │ │
│ │ │ │ │ ├── OrderCreatedEvent.java
│ │ │ │ │ ├── OrderPaidEvent.java
│ │ │ │ │ ├── OrderCancelledEvent.java
│ │ │ │ │ └── CustomerRegisteredEvent.java
│ │ │ │ │
│ │ │ │ ├── 📁 service/ # 领域服务
│ │ │ │ │ ├── OrderValidationService.java
│ │ │ │ │ ├── PricingService.java
│ │ │ │ │ └── InventoryService.java
│ │ │ │ │
│ │ │ │ └── 📁 exception/ # 领域异常
│ │ │ │ ├── DomainException.java
│ │ │ │ └── InvalidStateException.java
│ │ │ │
│ │ │ ├── 📁 infrastructure/ # 基础设施层(适配器实现)
│ │ │ │ ├── 📁 adapter/ # 适配器实现
│ │ │ │ │ ├── 📁 inbound/ # 入站适配器(驱动适配器)
│ │ │ │ │ │ ├── 📁 web/ # Web适配器
│ │ │ │ │ │ │ ├── 📁 controller/
│ │ │ │ │ │ │ │ ├── OrderController.java # REST控制器
│ │ │ │ │ │ │ │ │ ├── @RestController
│ │ │ │ │ │ │ │ │ ├── @RequestMapping("/api/orders")
│ │ │ │ │ │ │ │ │ └── implements IOrderService
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ ├── CustomerController.java
│ │ │ │ │ │ │ │ └── PaymentController.java
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ ├── 📁 dto/ # 请求/响应DTO
│ │ │ │ │ │ │ │ ├── 📁 request/
│ │ │ │ │ │ │ │ │ ├── CreateOrderRequest.java
│ │ │ │ │ │ │ │ │ └── UpdateOrderRequest.java
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ └── 📁 response/
│ │ │ │ │ │ │ │ ├── OrderResponse.java
│ │ │ │ │ │ │ │ └── ApiResponse.java
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ ├── 📁 filter/ # Web过滤器
│ │ │ │ │ │ │ │ ├── AuthenticationFilter.java
│ │ │ │ │ │ │ │ ├── LoggingFilter.java
│ │ │ │ │ │ │ │ └── CorsFilter.java
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ ├── 📁 interceptor/ # 拦截器
│ │ │ │ │ │ │ │ └── PerformanceInterceptor.java
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └── 📁 exception/ # 异常处理
│ │ │ │ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ │ │ │ └── ErrorResponse.java
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── 📁 cli/ # 命令行适配器
│ │ │ │ │ │ │ └── CommandLineInterface.java
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── 📁 messaging/ # 消息适配器
│ │ │ │ │ │ │ ├── OrderMessageConsumer.java
│ │ │ │ │ │ │ └── EventSubscriber.java
│ │ │ │ │ │ │
│ │ │ │ │ │ └── 📁 scheduled/ # 定时任务适配器
│ │ │ │ │ │ └── OrderCleanupScheduler.java
│ │ │ │ │ │
│ │ │ │ │ └── 📁 outbound/ # 出站适配器(被驱动适配器)
│ │ │ │ │ ├── 📁 persistence/ # 持久化适配器
│ │ │ │ │ │ ├── 📁 repositoryimpl/
│ │ │ │ │ │ │ ├── OrderRepositoryImpl.java # 实现IOrderRepository
│ │ │ │ │ │ │ ├── CustomerRepositoryImpl.java
│ │ │ │ │ │ │ └── ProductRepositoryImpl.java
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── 📁 mapper/
│ │ │ │ │ │ │ ├── OrderMapper.java # MyBatis Mapper
│ │ │ │ │ │ │ └── OrderDataMapper.java # DO<->Entity转换
│ │ │ │ │ │ │
│ │ │ │ │ │ └── 📁 entity/
│ │ │ │ │ │ ├── OrderEntity.java # JPA/MyBatis实体
│ │ │ │ │ │ ├── CustomerEntity.java
│ │ │ │ │ │ └── ProductEntity.java
│ │ │ │ │ │
│ │ │ │ │ ├── 📁 external/ # 外部服务适配器
│ │ │ │ │ │ ├── PaymentProviderAdapter.java # 实现IPaymentProvider
│ │ │ │ │ │ │ ├── @Service
│ │ │ │ │ │ │ └── implements IPaymentProvider
│ │ │ │ │ │ │
│ │ │ │ │ │ ├── EmailServiceAdapter.java # 实现INotificationService
│ │ │ │ │ │ │ ├── SMSServiceAdapter.java
│ │ │ │ │ │ │ └── ThirdPartyApiClient.java
│ │ │ │ │ │
│ │ │ │ │ ├── 📁 messaging/ # 消息适配器
│ │ │ │ │ │ ├── EventPublisherAdapter.java # 实现IEventPublisher
│ │ │ │ │ │ ├── MessageProducer.java
│ │ │ │ │ │ └── QueueSender.java
│ │ │ │ │ │
│ │ │ │ │ └── 📁 cache/ # 缓存适配器
│ │ │ │ │ ├── RedisCacheAdapter.java
│ │ │ │ │ └── LocalCacheAdapter.java
│ │ │ │ │
│ │ │ │ ├── 📁 config/ # 配置类
│ │ │ │ │ ├── DatabaseConfig.java
│ │ │ │ │ ├── WebConfig.java
│ │ │ │ │ ├── SecurityConfig.java
│ │ │ │ │ ├── CacheConfig.java
│ │ │ │ │ └── BeanConfig.java
│ │ │ │ │
│ │ │ │ ├── 📁 database/ # 数据库相关
│ │ │ │ │ ├── 📁 migration/
│ │ │ │ │ │ ├── V1__init.sql
│ │ │ │ │ │ └── V2__add_orders.sql
│ │ │ │ │ │
│ │ │ │ │ └── 📁 enums/
│ │ │ │ │ ├── OrderStatus.java
│ │ │ │ │ └── UserRole.java
│ │ │ │ │
│ │ │ │ └── 📁 security/ # 安全相关
│ │ │ │ ├── JwtTokenProvider.java
│ │ │ │ ├── PasswordEncoder.java
│ │ │ │ └── SecurityUtils.java
│ │ │ │
│ │ │ ├── 📁 shared/ # 共享组件
│ │ │ │ ├── 📁 kernel/ # 核心共享
│ │ │ │ │ ├── BaseEntity.java
│ │ │ │ │ ├── AggregateRoot.java
│ │ │ │ │ ├── ValueObject.java
│ │ │ │ │ └── Identifier.java
│ │ │ │ │
│ │ │ │ ├── 📁 util/ # 工具类
│ │ │ │ │ ├── DateUtils.java
│ │ │ │ │ ├── StringUtils.java
│ │ │ │ │ ├── Validator.java
│ │ │ │ │ └── ObjectMapperUtils.java
│ │ │ │ │
│ │ │ │ ├── 📁 constants/ # 常量定义
│ │ │ │ │ ├── AppConstants.java
│ │ │ │ │ ├── ErrorCodes.java
│ │ │ │ │ └── ValidationMessages.java
│ │ │ │ │
│ │ │ │ └── 📁 exception/ # 全局异常
│ │ │ │ ├── GlobalException.java
│ │ │ │ ├── ErrorResponse.java
│ │ │ │ └── ExceptionHandler.java
│ │ │ │
│ │ │ └── OrderApplication.java # 应用启动类
│ │ │ ├── @SpringBootApplication
│ │ │ └── main(String[] args)
│ │ │
│ │ └── 📁 resources/
│ │ ├── application.yml
│ │ ├── application-dev.yml
│ │ ├── application-prod.yml
│ │ ├── 📁 db/
│ │ │ ├── migration/
│ │ │ └── seed/
│ │ ├── 📁 i18n/
│ │ │ ├── messages.properties
│ │ │ └── messages_zh.properties
│ │ ├── 📁 templates/
│ │ │ └── email/
│ │ ├── logback-spring.xml
│ │ └── banner.txt
│ │
│ └── 📁 test/
│ ├── 📁 unit/
│ │ ├── 📁 domain/
│ │ │ ├── OrderTest.java
│ │ │ └── MoneyTest.java
│ │ ├── 📁 application/
│ │ │ └── CreateOrderUseCaseTest.java
│ │ └── 📁 infrastructure/
│ │ └── OrderRepositoryImplTest.java
│ │
│ ├── 📁 integration/
│ │ └── OrderIntegrationTest.java
│ │
│ └── 📁 e2e/
│ └── ApiE2ETest.java
│
├── 📁 docker/
│ ├── Dockerfile
│ └── docker-compose.yml
│
├── pom.xml
├── README.md
└── .gitignore
适用场景: 大型企业项目,多限界上下文,需要独立部署和技术隔离
ecommerce-platform/ # 电商平台(微服务父工程)
│
├── 📁 order-service/ # 订单服务(独立微服务)
│ ├── 📁 order-api/ # API模块(端口定义)
│ │ ├── 📁 src/main/java/io/ddd4j/order/api/
│ │ │ ├── 📁 ports/ # 端口接口
│ │ │ │ ├── 📁 inbound/
│ │ │ │ │ ├── IOrderService.java # 订单服务端口
│ │ │ │ │ ├── ICustomerService.java
│ │ │ │ │ └── IPaymentService.java
│ │ │ │ │
│ │ │ │ └── 📁 outbound/
│ │ │ │ ├── IOrderRepository.java # 仓储端口
│ │ │ │ ├── ICustomerRepository.java
│ │ │ │ ├── IPaymentProvider.java # 支付端口
│ │ │ │ └── IEventPublisher.java # 事件发布端口
│ │ │ │
│ │ │ └── 📁 dto/ # API DTO
│ │ │ ├── CreateOrderCmd.java
│ │ │ ├── OrderDTO.java
│ │ │ └── OrderItemDTO.java
│ │ │
│ │ └── pom.xml
│ │
│ ├── 📁 order-domain/ # 领域模块(核心业务)
│ │ ├── 📁 src/main/java/io/ddd4j/order/domain/
│ │ │ ├── 📁 model/
│ │ │ │ ├── Order.java # 聚合根
│ │ │ │ ├── OrderItem.java
│ │ │ │ ├── Customer.java
│ │ │ │ └── Product.java
│ │ │ │
│ │ │ ├── 📁 valueobject/
│ │ │ │ ├── OrderId.java
│ │ │ │ ├── Money.java
│ │ │ │ └── Email.java
│ │ │ │
│ │ │ ├── 📁 event/
│ │ │ │ ├── OrderCreatedEvent.java
│ │ │ │ └── OrderPaidEvent.java
│ │ │ │
│ │ │ ├── 📁 service/
│ │ │ │ └── OrderValidationService.java
│ │ │ │
│ │ │ └── 📁 exception/
│ │ │ └── DomainException.java
│ │ │
│ │ └── pom.xml
│ │
│ ├── 📁 order-application/ # 应用模块(用例实现)
│ │ ├── 📁 src/main/java/io/ddd4j/order/application/
│ │ │ ├── 📁 services/
│ │ │ │ ├── OrderServiceImpl.java # 实现IOrderService
│ │ │ │ └── CustomerServiceImpl.java
│ │ │ │
│ │ │ ├── 📁 usecases/
│ │ │ │ ├── CreateOrderUseCase.java
│ │ │ │ ├── ProcessOrderUseCase.java
│ │ │ │ └── CancelOrderUseCase.java
│ │ │ │
│ │ │ └── 📁 exception/
│ │ │ └── ApplicationException.java
│ │ │
│ │ └── pom.xml
│ │
│ ├── 📁 order-infrastructure/ # 基础设施模块(适配器实现)
│ │ ├── 📁 src/main/java/io/ddd4j/order/infrastructure/
│ │ │ ├── 📁 adapter/
│ │ │ │ ├── 📁 inbound/
│ │ │ │ │ ├── 📁 web/
│ │ │ │ │ │ ├── OrderController.java # REST适配器
│ │ │ │ │ │ └── dto/
│ │ │ │ │ │
│ │ │ │ │ ├── 📁 messaging/
│ │ │ │ │ │ └── OrderEventConsumer.java # 消息适配器
│ │ │ │ │ │
│ │ │ │ │ └── 📁 cli/
│ │ │ │ │ └── CommandLineAdapter.java
│ │ │ │ │
│ │ │ │ └── 📁 outbound/
│ │ │ │ ├── 📁 persistence/
│ │ │ │ │ ├── OrderRepositoryImpl.java # 持久化适配器
│ │ │ │ │ ├── OrderMapper.java
│ │ │ │ │ └── OrderEntity.java
│ │ │ │ │
│ │ │ │ ├── 📁 external/
│ │ │ │ │ ├── PaymentProviderAdapter.java # 外部服务适配器
│ │ │ │ │ └── EmailServiceAdapter.java
│ │ │ │ │
│ │ │ │ └── 📁 messaging/
│ │ │ │ └── EventPublisherAdapter.java # 消息发布适配器
│ │ │ │
│ │ │ ├── 📁 config/
│ │ │ │ ├── DatabaseConfig.java
│ │ │ │ ├── WebConfig.java
│ │ │ │ └── SecurityConfig.java
│ │ │ │
│ │ │ └── 📁 security/
│ │ │ └── JwtTokenProvider.java
│ │ │
│ │ └── pom.xml
│ │
│ ├── 📁 order-start/ # 启动模块
│ │ ├── 📁 src/main/java/io/ddd4j/order/
│ │ │ └── OrderApplication.java
│ │ │
│ │ ├── 📁 src/main/resources/
│ │ │ ├── application.yml
│ │ │ └── 📁 mapper/
│ │ │
│ │ └── pom.xml
│ │
│ └── pom.xml # 订单服务父POM
│
├── 📁 customer-service/ # 客户服务(独立微服务)
│ ├── 📁 customer-api/ # 客户API模块
│ │ └── 📁 src/main/java/io/ddd4j/customer/api/
│ │ ├── 📁 ports/
│ │ │ ├── ICustomerService.java
│ │ │ └── ICustomerRepository.java
│ │ └── 📁 dto/
│ │
│ ├── 📁 customer-domain/ # 客户领域模块
│ │ └── 📁 src/main/java/io/ddd4j/customer/domain/
│ │ ├── 📁 model/
│ │ │ └── Customer.java
│ │ └── 📁 valueobject/
│ │ └── Email.java
│ │
│ ├── 📁 customer-application/ # 客户应用模块
│ │ └── 📁 src/main/java/io/ddd4j/customer/application/
│ │ └── 📁 services/
│ │ └── CustomerServiceImpl.java
│ │
│ ├── 📁 customer-infrastructure/ # 客户基础设施模块
│ │ └── 📁 src/main/java/io/ddd4j/customer/infrastructure/
│ │ └── 📁 adapter/
│ │ ├── 📁 inbound/
│ │ │ └── 📁 web/
│ │ │ └── CustomerController.java
│ │ └── 📁 outbound/
│ │ └── 📁 persistence/
│ │ └── CustomerRepositoryImpl.java
│ │
│ ├── 📁 customer-start/ # 客户启动模块
│ │ └── 📁 src/main/java/io/ddd4j/customer/
│ │ └── CustomerApplication.java
│ │
│ └── pom.xml
│
├── 📁 payment-service/ # 支付服务(独立微服务)
│ ├── 📁 payment-api/
│ ├── 📁 payment-domain/
│ ├── 📁 payment-application/
│ ├── 📁 payment-infrastructure/
│ └── 📁 payment-start/
│
├── 📁 product-service/ # 产品服务(独立微服务)
│ ├── 📁 product-api/
│ ├── 📁 product-domain/
│ ├── 📁 product-application/
│ ├── 📁 product-infrastructure/
│ └── 📁 product-start/
│
├── 📁 shared-kernel/ # 共享内核
│ ├── 📁 shared-domain/ # 共享领域模块
│ │ └── 📁 src/main/java/io/ddd4j/shared/domain/
│ │ ├── 📁 model/
│ │ │ ├── Money.java
│ │ │ └── Email.java
│ │ └── 📁 event/
│ │ └── DomainEvent.java
│ │
│ ├── 📁 shared-infrastructure/ # 共享基础设施
│ │ └── 📁 src/main/java/io/ddd4j/shared/infrastructure/
│ │ ├── 📁 config/
│ │ │ └── CommonConfig.java
│ │ └── 📁 util/
│ │ └── JsonUtils.java
│ │
│ └── pom.xml
│
├── 📁 gateway/ # API网关
│ └── 📁 src/main/java/io/ddd4j/gateway/
│ ├── GatewayApplication.java
│ └── 📁 filter/
│ ├── AuthFilter.java
│ └── RateLimitFilter.java
│
├── 📁 docker/ # Docker编排
│ ├── docker-compose.yml
│ └── 📁 docker/
│ ├── order-service/
│ ├── customer-service/
│ └── gateway/
│
├── 📁 k8s/ # Kubernetes配置
│ ├── 📁 order-service/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ │
│ ├── 📁 customer-service/
│ └── 📁 gateway/
│
├── pom.xml # 父POM
├── README.md
└── .gitignore
┌─────────────────────────────────────┐
│ 应用层(Application) │
│ - 用例(Use Cases) │
│ - 应用服务(Application Services) │
└─────────────────────────────────────┘
↑ ↓
┌─────────────────┴─────────────┴─────────────────┐
│ 端口(Ports) │
│ - 入站端口(Inbound/Driving) │
│ - 出站端口(Outbound/Driven) │
└─────────────────────────────────────────────────┘
↑ ↓
┌─────────────────┴─────────────┴─────────────────┐
│ 适配器(Adapters) │
│ - 入站适配器:Web、CLI、Messaging │
│ - 出站适配器:Database、External API、Cache │
└─────────────────────────────────────────────────┘
适配器(Adapters) → 端口(Ports) ← 应用层(Application) ← 领域层(Domain)
端口是应用与外部世界交互的接口,分为两类:
定义应用对外提供的服务能力:
// application/ports/inbound/IOrderService.java
public interface IOrderService {
OrderId createOrder(CreateOrderCmd cmd);
Order getOrder(OrderId id);
void cancelOrder(OrderId id);
List<Order> getCustomerOrders(CustomerId customerId);
}
定义应用依赖的外部服务:
// application/ports/outbound/IOrderRepository.java
public interface IOrderRepository {
void save(Order order);
Optional<Order> findById(OrderId id);
List<Order> findByCustomer(CustomerId customerId);
}
// application/ports/outbound/IPaymentProvider.java
public interface IPaymentProvider {
PaymentResult processPayment(PaymentInfo paymentInfo);
}
// application/ports/outbound/IEventPublisher.java
public interface IEventPublisher {
void publish(DomainEvent event);
}
适配器是端口的具体实现,分为两类:
驱动应用执行的适配器:
// infrastructure/adapter/inbound/web/OrderController.java
@RestController
@RequestMapping("/api/orders")
public class OrderController implements IOrderService {
private final IOrderService orderService; // 注入端口
@PostMapping
public ResponseEntity<OrderResponse> createOrder(@RequestBody CreateOrderRequest request) {
CreateOrderCmd cmd = toCommand(request);
OrderId orderId = orderService.createOrder(cmd);
return ResponseEntity.ok(new OrderResponse(orderId));
}
@GetMapping("/{id}")
public ResponseEntity<OrderResponse> getOrder(@PathVariable String id) {
Order order = orderService.getOrder(new OrderId(id));
return ResponseEntity.ok(toResponse(order));
}
}
被应用调用的适配器:
// infrastructure/adapter/outbound/persistence/OrderRepositoryImpl.java
@Repository
public class OrderRepositoryImpl implements IOrderRepository {
private final OrderMapper orderMapper;
@Override
public void save(Order order) {
OrderEntity entity = toEntity(order);
orderMapper.insert(entity);
}
@Override
public Optional<Order> findById(OrderId id) {
OrderEntity entity = orderMapper.selectById(id.getValue());
return Optional.ofNullable(toDomain(entity));
}
}
// infrastructure/adapter/outbound/external/PaymentProviderAdapter.java
@Service
public class PaymentProviderAdapter implements IPaymentProvider {
private final AlipayClient alipayClient;
@Override
public PaymentResult processPayment(PaymentInfo paymentInfo) {
// 调用支付宝API
return alipayClient.pay(paymentInfo);
}
}
用例封装特定的业务流程:
// application/usecases/order/CreateOrderUseCase.java
@Component
public class CreateOrderUseCase {
private final IOrderRepository orderRepository;
private final ICustomerRepository customerRepository;
private final IProductRepository productRepository;
private final IEventPublisher eventPublisher;
public OrderId execute(CreateOrderCmd cmd) {
// 1. 验证客户
Customer customer = customerRepository.findById(cmd.getCustomerId())
.orElseThrow(() -> new CustomerNotFoundException(cmd.getCustomerId()));
// 2. 创建订单
Order order = Order.create(
customer.getId(),
cmd.getItems(),
cmd.getShippingAddress()
);
// 3. 保存订单
orderRepository.save(order);
// 4. 发布事件
eventPublisher.publish(new OrderCreatedEvent(
order.getId(),
customer.getId(),
order.getTotalAmount()
));
return order.getId();
}
}
// infrastructure/config/BeanConfig.java
@Configuration
public class BeanConfig {
// 出站适配器Bean
@Bean
public IOrderRepository orderRepository(OrderMapper orderMapper) {
return new OrderRepositoryImpl(orderMapper);
}
@Bean
public IPaymentProvider paymentProvider(AlipayClient alipayClient) {
return new PaymentProviderAdapter(alipayClient);
}
@Bean
public IEventPublisher eventPublisher(KafkaTemplate<String, String> kafkaTemplate) {
return new KafkaEventPublisherAdapter(kafkaTemplate);
}
// 应用服务Bean
@Bean
public IOrderService orderService(
IOrderRepository orderRepository,
IPaymentProvider paymentProvider,
IEventPublisher eventPublisher
) {
return new OrderServiceImpl(
orderRepository,
paymentProvider,
eventPublisher
);
}
}
// 测试示例:使用Mock端口
class CreateOrderUseCaseTest {
@Test
void should_create_order_successfully() {
// Given: Mock出站端口
IOrderRepository mockRepo = mock(IOrderRepository.class);
ICustomerRepository mockCustomerRepo = mock(ICustomerRepository.class);
IEventPublisher mockPublisher = mock(IEventPublisher.class);
// Setup mock behavior
when(mockCustomerRepo.findById(any())).thenReturn(Optional.of(customer));
// When: 执行用例
CreateOrderUseCase useCase = new CreateOrderUseCase(
mockRepo, mockCustomerRepo, mockPublisher
);
OrderId orderId = useCase.execute(cmd);
// Then: 验证交互
verify(mockRepo).save(any(Order.class));
verify(mockPublisher).publish(any(OrderCreatedEvent.class));
}
}
| 方面 | 六边形架构 | DDD 分层架构 |
|---|---|---|
| 核心理念 | 端口和适配器 | 领域驱动设计 |
| 依赖方向 | 适配器 → 端口 ← 应用 | 接口 → 应用 → 领域 ← 基础设施 |
| 关注点 | 技术隔离 | 业务领域建模 |
| 适用场景 | 需要技术替换的场景 | 复杂业务领域 |
# 创建六边形架构项目
mvn archetype:generate \
-DarchetypeGroupId=io.ddd4j.boot \
-DarchetypeArtifactId=hexagonal-archetype \
-DarchetypeVersion=3.3.x