当前位置: 首页 > news >正文

DDD之事件机制(9)

一、序言

        在领域驱动设计(DDD)中,事件机制(Domain Event) 是领域模型解耦的重要手段。领域事件代表着业务中“已经发生的事实”,例如订单已创建、支付已完成、库存已扣减等。这些事件能够让系统各个模块之间通过“事件发布-订阅”方式进行通信,从而避免强耦合调用,提高系统的灵活性和扩展性。

二、设计

1. DomainEventBus 的实现

DomainEventBus 是事件发布与订阅的核心。它相当于一个“事件总线”,负责事件的注册、分发与监听。

public class DomainEventBus {private static final Map<Class<?>, List<Consumer<?>>> handlers = new HashMap<>();public <T> void register(Class<T> eventType, Consumer<T> handler) {handlers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(handler);}@SuppressWarnings("unchecked")public <T> void publish(T event) {List<Consumer<?>> eventHandlers = handlers.getOrDefault(event.getClass(), new ArrayList<>());for (Consumer<?> handler : eventHandlers) {((Consumer<T>) handler).accept(event);}}
}
2. 具体的事件类(如 OrderCreatedEvent

事件类要表达清楚“发生了什么事”,并包含必要的上下文信息:

public class OrderCreatedEvent {private final String orderId;private final LocalDateTime createdAt;public OrderCreatedEvent(String orderId, LocalDateTime createdAt) {this.orderId = orderId;this.createdAt = createdAt;}public String getOrderId() { return orderId; }public LocalDateTime getCreatedAt() { return createdAt; }
}
3. 事件处理器类(如 OrderEventHandler

事件处理器订阅并消费事件,执行业务逻辑,例如发送消息通知、扣减库存等:

public class OrderEventHandler {public void onOrderCreated(OrderCreatedEvent event) {System.out.println("处理订单创建事件,订单ID: " + event.getOrderId());// 例如:发送消息、更新统计、调用外部服务等}
}

三、实践

  1. 业务逻辑触发:订单模块创建订单后,发布 OrderCreatedEvent
  2. 事件总线分发:DomainEventBus.publish(event) 将事件广播给所有订阅者。
  3. 事件处理器消费:OrderEventHandler 监听并处理该事件,执行相应逻辑。
public class Demo {public static void main(String[] args) {DomainEventBus eventBus = new DomainEventBus();// 注册事件处理器OrderEventHandler handler = new OrderEventHandler();eventBus.register(OrderCreatedEvent.class, handler::onOrderCreated);// 模拟订单创建并发布事件OrderCreatedEvent event = new OrderCreatedEvent("ORDER123", LocalDateTime.now());eventBus.publish(event);}
}

四、总结

        DDD 的事件机制通过 事件发布-订阅 解耦了领域模型和外围系统,使得核心业务逻辑更加内聚,而扩展逻辑(通知、日志、统计、外部调用)可以通过监听事件灵活实现。
在实际项目中,遇到绝大多数的场景都是微服务,那么可以将 DomainEventBus 替换为更成熟的消息中间件(如 Kafka、RabbitMQ、Spring Event),实现跨进程甚至跨系统的事件驱动架构,从而支撑复杂的分布式业务场景。

        欢迎关注、一起交流、一起进步。

http://www.dtcms.com/a/353888.html

相关文章:

  • 沃丰科技出海客服系统对接沃尔玛全球电商平台,赋能中企出海
  • 升级DrRacket8.10到8.18版本@Ubuntu24.04
  • GitLab 导入/导出仓库
  • 金融 IT 运维痛点突围:用网络管理工具筑牢业务稳定防线(附 OpManager Plus 实践)
  • 【51单片机按键按下数码管秒增计时并LED亮释放停计时LED熄】2022-11-12
  • Android -第二十一次技术总结
  • 使用LLAMA_cpp_python进行qwen2.5-vl-7b-instruct进行推理
  • 【URP】Unity Shader Tags
  • IT66122替代IT66121-富利威
  • Day12 Gin框架学习
  • .NET周刊【8月第3期 2025-08-17】
  • 【C#】获取不重复的编码(递增,非GUID)
  • (LeetCode 面试经典 150 题) 102. 二叉树的层序遍历(广度优先搜索bfs)
  • Miniforge3替代Anaconda的一些经验总结
  • STL库——vector(类模拟实现)
  • 旧物二手回收小程序系统:让闲置旧物焕发新生,创造无限价值
  • Leetcode 深度优先搜索 (14)
  • 胶水研究记录学习1
  • 回顾websocket心跳机制以及断线重连(服务端为node)
  • 数据结构——抽象数据类型(ADT)
  • 浏览器渲染帧管线全景拆解:从像素到屏幕的 16.67 ms 之旅
  • Linux内核bitmap组件详解
  • 给Ubuntu添加新用户
  • MyBatis 之关联查询(一对一、一对多及多对多实现)
  • Ansible Playbook 概述与实践案例(下)
  • 基于muduo库的图床云共享存储项目(二)
  • STM32 之串口WIFI应用--基于RTOS的环境
  • AlphaFold 2 本地部署与安装教程(Linux)
  • ICCV 2025 | 清华IEDA提出GUAVA,单图创建可驱动的上半身3D化身!实时、高效,还能捕捉细腻的面部表情和手势。
  • 【51单片机】【protues仿真】基于51单片机篮球计时计分器数码管系统