CQRS在一条订单系统中的实践(三)--DDD分层协作实践
DDD分层协作
文章图片
支付订单分层
文章图片
用户接口层:适配不同终端(gateway api、dubbo api、kafka consumer)生成Command
|-com.yit.orders.facade:
|-com.yit.orders.facade.OrderPayService:创建OrderPayCommand,交由PayingOrderCommandHandler执行
应用服务层:执行来自用户界面层的命令,不实现具体业务。一般过程为,通过领域仓储访问聚合,调度聚合的行为函数响应命令,管理聚合对应的事务并通过领域仓储对聚合进行持久化,通过事件总线发布和订阅聚合产生的领域事件;
|-com.yit.orders.module.paying.application
|-command
|-com.yit.orders.module.paying.application.command.OrderPayCommand:支付指令
|-com.yit.orders.module.paying.application.command.PayingOrderCommandHandler:支付指令的执行(应用服务,管理多个聚合的事务,支付订单的例子中仅操作一个聚合)
|-domainEventHandler
|-com.yit.orders.module.paying.application.domainEventHandler.pay.common.OrderPayEventHandler:订阅领域事件(通过订阅模型进行解耦)
领域层:主要实现领域模型的核心业务逻辑,体现领域模型的业务能力。聚合确保业务逻辑的原子性和一致性(聚合内实体的事务边界),产生领域事件。
|-com.yit.orders.module.paying.domain
|-aggregate
|-com.yit.orders.module.paying.domain.aggregate.IPayingOrderRepository:定义聚合仓储接口(依赖倒置)
|-com.yit.orders.module.paying.domain.aggregate.ReadWritePayingNormalOrder:聚合(写模型),内聚业务逻辑,所有的业务扭转都必须通过聚合达成
|-event
|-com.yit.orders.module.paying.domain.event.pay.common.OrderPayEvent:领域事件(值对象,由聚合或实体产生,在应用层进行发布,进行聚合边界之外的通信)
|-readonly
|-com.yit.orders.module.paying.domain.readonly.ReadonlyPayingOrder:读模型
领域仓储层:
|-com.yit.orders.module.paying.infrastructure
|-com.yit.orders.module.paying.infrastructure.PayingOrderRepository:实现了领域层定义领域仓储接口(通过接口的方式达到外层依赖内层)
实现参考:
推荐一下MS的这个官方微服务示例项目
EShopOnContainers
设计面向 DDD 的微服务
【CQRS在一条订单系统中的实践(三)--DDD分层协作实践】DDD 分层