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());// 例如:发送消息、更新统计、调用外部服务等}
}
三、实践
- 业务逻辑触发:订单模块创建订单后,发布
OrderCreatedEvent
。 - 事件总线分发:
DomainEventBus.publish(event)
将事件广播给所有订阅者。 - 事件处理器消费:
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),实现跨进程甚至跨系统的事件驱动架构,从而支撑复杂的分布式业务场景。
欢迎关注、一起交流、一起进步。