CQRS在一条订单系统中的实践(三)--DDD分层协作实践

DDD分层协作

CQRS在一条订单系统中的实践(三)--DDD分层协作实践_第1张图片

支付订单分层

CQRS在一条订单系统中的实践(三)--DDD分层协作实践_第2张图片

用户接口层:适配不同终端(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 的微服务

DDD 分层

你可能感兴趣的:(dddjava后端cqrs)