领域事件(Domain Event)
领域事件是领域驱动设计中记录领域状态变化的重要模式,它表示业务领域中发生的重要事情。
汽车生产案例
在汽车制造厂中,领域事件可以理解为:
- 发动机装配完成(触发质量检测流程)
- 整车下线(触发物流配送流程)
- 零部件库存不足(触发采购流程)
这些事件记录了业务中发生的重要变化,并可能触发后续操作。
主要特点
- 不可变性:事件发生后不可更改
- 时间点:记录特定时刻发生的事情
- 业务意义:反映重要的业务状态变化
- 通知机制:可触发其他业务逻辑
示例
java
// 发动机装配完成事件
class EngineAssembledEvent {
private final String engineId;
private final LocalDateTime assembledTime;
private final String assemblyLineId;
public EngineAssembledEvent(String engineId, LocalDateTime assembledTime, String assemblyLineId) {
this.engineId = engineId;
this.assembledTime = assembledTime;
this.assemblyLineId = assemblyLineId;
}
public String getEngineId() { return engineId; }
public LocalDateTime getAssembledTime() { return assembledTime; }
public String getAssemblyLineId() { return assemblyLineId; }
}
// 整车下线事件
class CarCompletedEvent {
private final String vin;
private final LocalDateTime completionTime;
private final String model;
public CarCompletedEvent(String vin, LocalDateTime completionTime, String model) {
this.vin = vin;
this.completionTime = completionTime;
this.model = model;
}
public String getVin() { return vin; }
public LocalDateTime getCompletionTime() { return completionTime; }
public String getModel() { return model; }
}
使用场景
- 记录重要的业务状态变化
- 实现聚合间的最终一致性
- 触发后续业务流程
- 支持事件溯源模式
设计原则
- 显式命名:名称应使用过去时态(如OrderPaid)
- 不可变:所有属性应为final
- 自描述:包含足够的信息供消费者使用
- 轻量级:避免包含过多数据