Skip to content

领域事件(Domain Event)

领域事件是领域驱动设计中记录领域状态变化的重要模式,它表示业务领域中发生的重要事情。

汽车生产案例

在汽车制造厂中,领域事件可以理解为:

  • 发动机装配完成(触发质量检测流程)
  • 整车下线(触发物流配送流程)
  • 零部件库存不足(触发采购流程)

这些事件记录了业务中发生的重要变化,并可能触发后续操作。

主要特点

  1. 不可变性:事件发生后不可更改
  2. 时间点:记录特定时刻发生的事情
  3. 业务意义:反映重要的业务状态变化
  4. 通知机制:可触发其他业务逻辑

示例

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; }
}

使用场景

  1. 记录重要的业务状态变化
  2. 实现聚合间的最终一致性
  3. 触发后续业务流程
  4. 支持事件溯源模式

设计原则

  1. 显式命名:名称应使用过去时态(如OrderPaid)
  2. 不可变:所有属性应为final
  3. 自描述:包含足够的信息供消费者使用
  4. 轻量级:避免包含过多数据