5

我正在研究领域事件,特别是两种可能性:

A. 使用这样的“通用”事件:

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

然后消费者会找出新的状态并做一些事情。由于我使用的是 Rx,所以这并不难(并且比开关/外壳更好):

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

B. 使用特定事件:

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

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

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

4

2 回答 2

2

这将归结为“通用”事件是否会导致任何行为。如果它仅带有一个有趣的值,例如“类别”,那么一个通用事件就足够了。

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

于 2015-11-15T05:58:53.747 回答
1

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

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

如果我理解正确,B. 更明确,也使代码更简洁:

var subscription = DomainEvents
   .AsObservable<OrderCompletedEvent>()
   .Subscribe(OnOrderCompleted);
于 2015-11-13T16:06:53.233 回答