DDD各层次职责与协作关系

本文探讨了在领域驱动设计(DDD)的架构下,如何通过分层架构实现订单提交的业务流程。详细分析了各层间的职责划分及协作方式,以电商系统为例,展示了从Controller到应用层再到基础设施层的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

架构演进得到了 符合DDD思想的分层架构 是一种静态逻辑划分

 

实现业务用例时,各层之间是怎么协作的?

 

辨别动态协作关系的方法:

职责的角度入手,清楚地理解分层架构中每个层次的职责

 

案例:

电商系统的下订单场景

买家提交订单时,除了与订单直接有关的业务之外,还需要执行以下操作:

 

  • 订单数据的持久化:OrderRepository 提供插入订单功能。它属于支撑订单提交业务的基础功能,但将订单持久化到数据库的实现 OrderMapper 并不属于该业务范畴。

  • 发送通知邮件:NotificationService 提供通知服务。它属于支撑通知业务的基础功能,但邮件发送的实现 EmailSender 却不属于该业务范畴。

  • 异步发送消息给仓储系统:提交订单成功后需要异步发送消息 OrderConfirmed 给仓储系统,这一通信模式是通过消息队列来完成的。EventBus 发送 OrderConfirmed 事件属于支撑订单提交成功的基础功能,但发送该事件到 RabbitMQ 消息队列的 RabbitEventBus 则不属于该业务范畴。

 

OrderController: 暴露 RESTful 服务。

它本身不提供任何业务实现,而是通过将请求委派给应用层的 OrderAppService 来完成(业务处理)订单的提交。

 

前述三个流程在各层之间以及系统内外部之间的协作关系如下图所示:

 

OrderController

北向网关的角色

通过 Spring Boot 来完成对 HTTP 请求的响应、路由和请求/响应消息的序列化与反序列化

 

职责:

1 请求/响应消息的验证

2 OrderAppService 的调用

 

南向网关

包括 OrderMapper、EmailSender 和 RabbitEventBus,它们对内为具体的某个业务提供支撑功能,对外则需要借助框架或驱动器访问外部资源

 

南向网关的调用由属于内层的应用服务 OrderAppService 发起,因此需要为它们建立抽象来解除内层对外层的依赖。(repository的实现抽象出接口)

 

1 Repository 提供的方法分属领域逻辑,故而将 OrderMapper 所要实现的接口 OrderRepository 放到核心的领域层

2 EmailSender 与 RabbitEventBus 各自的抽象 NotificationService 与 EventBus 并未代表领域逻辑,为了不污染领域层的纯洁性,放在应用层似乎更为合理

 

归纳各个层次的职责:

 

领域层:包含 PlaceOrderService、Order、Notification、OrderConfirmed 与抽象的 OrderRepository,封装了纯粹的业务逻辑,不掺杂任何与业务无关的技术实现。

应用层:包含 OrderAppService 以及抽象的 EventBus 与 NotificationService,提供对外体现业务价值的统一接口(用例 角色的直接操作的业务),同时还包含了基础设施功能的抽象接口(业务需要 但是不在本领域内 通过依赖第三方功能实现 )。

基础设施层: 包含 OrderMapper、RabbitEventBus 与 EmailSender,为业务实现(前提是属于本领域的业务)提供对应的技术功能支撑,但真正的基础设施访问则委派给系统边界之外的外部框架或驱动器。

 

两个分属不同层次的服务,二者极容易混淆。

PlaceOrderService 是领域服务,定义在领域层中;

OrderAppService 是应用服务,定义在应用层中。这二者的区别属于战术设计的层面

 

 

demo:

 

Controller 的实现代码:

代码块

Java

@RestController
@RequestMapping(value = "/orders/")
public class OrderController {
    @Autowired
    private OrderAppService service;
    @RequestMapping(method = RequestMethod.POST)
    public void create(@RequestParam(value = "request", required = true) CreateOrderRequest request) {
        if (request.isInvalid()) {  //基本参数校验
            throw new BadRequestException("the request of placing order is invalid.");
        }
        Order order = request.toOrder();
        service.placeOrder(order); //调用Appservice方法
    }
}

 

OrderAppService 的实现代码:

代码块

Java

@Serivce
public class OrderAppService {
    @Autowired
    private NotificationService notificationService;
    @Autowired
    private EventBus eventBus;
    @Autowired
    private PlaceOrderService placeOrderService;
    public void placeOrder(Order order) {
        try {
            placeOrderService.execute(order);    //本领域业务逻辑
            notificatonService.send(composeNotification(order));   // 应用层  第三方的服务  非本领域
            eventBus.publish(composeEvent(order));
        } catch (InvalidOrderException | Exception ex) {
            throw new ApplicationException(ex.getMessage());
        }
    }
    private Notification composeNotification(Order order) {
        // 组装通知邮件的内容,实现略
    }
    private OrderConfirmed composeEvent(Order order) {
        // 组装订单确认事件的内容,实现略
    }
}

 

OrderAppService 属于应用层 不应该包含 具体的业务逻辑

将 发送邮件 以及异步消息 作为 横切关注点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值