DDD 通用与特定领域事件

DDD generic vs. specific domain events

我正在查看域事件,特别是 2 种可能性:

一个。使用 "generic" 这样的事件:

public class OrderStateChangedEvent : IEvent
{
  public Guid OrderId { get; }
  public OrderState NewState { get; }
}

然后消费者会找出新的状态并做一些事情。因为我使用的是 Rx,所以这并不难(而且比 switch/case 好得多):

var subscription = DomainEvents
     .AsObservable<OrderStateChangedEvent>()
     .Where(e => e.NewState == OrderState.OrderCompleted)
     .Subscribe(OnOrderCompleted);

乙。使用特定事件:

public class OrderCompletedEvent : IEvent
{
  public Guid OrderId { get; }
}

这将导致更多事件 classes,一方面可能会太多,另一方面事件 class 名称包含语言,这可能是一个加分点。

你有什么建议吗?我对领域事件没有经验,不能在这里做出合格的决定(两者似乎都没有任何重大缺点)

根据一般经验,使用 switch 语句通常被认为是 OO 语言中的代码异味。

http://c2.com/cgi/wiki?SwitchStatementsSmell

乙。更明确,也使代码更简洁,如果我理解正确的话:

var subscription = DomainEvents
   .AsObservable<OrderCompletedEvent>()
   .Subscribe(OnOrderCompleted);

这将归结为 "generic" 事件是否会导致任何行为。如果它仅包含一个有趣的值,例如 "category" 可能那么一个通用事件就足够了。

但是,如果事件有任何特定的行为并且因此在系统中具有任何特定的含义,我肯定会建议采用更明确的方法。