C# DDD通用与特定域事件

C# DDD通用与特定域事件,c#,domain-driven-design,domain-events,C#,Domain Driven Design,Domain Events,我正在研究域事件,特别是两种可能性: A.使用“通用”事件,如: public class OrderStateChangedEvent : IEvent { public Guid OrderId { get; } public OrderState NewState { get; } } 然后消费者会发现新的状态并采取行动。因为我使用的是Rx,所以这并不难(而且比开关/外壳好得多): 这将导致更多的事件类,一方面可能会得到太多,另一方面事件类名称包含语言,这可能是一个加分 你有什么

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

A.使用“通用”事件,如:

public class OrderStateChangedEvent : IEvent
{
  public Guid OrderId { get; }
  public OrderState NewState { get; }
}
然后消费者会发现新的状态并采取行动。因为我使用的是Rx,所以这并不难(而且比开关/外壳好得多):

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


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

作为一般经验法则,在OO语言中使用
switch
语句通常被认为是一种代码味道

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

var subscription = DomainEvents
   .AsObservable<OrderCompletedEvent>()
   .Subscribe(OnOrderCompleted);
var subscription=DomainEvents
.AsObservable()
.认购(按订单完成);

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


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

我不会在两种变体中都使用switch case,正如我所说的,我认为一个<>代码>类型/字段>选择子句在类型字段A<代码>开关中。实际上,有附加到特定事件的行为。对于泛型事件,订阅者将试图自己弄清楚行为是什么,因此使用特定事件更为合理——尽管像“订阅某个域对象的所有状态机更改”这样的任务可能更难执行,因为这些状态更改意味着不同的事情(订单竞争、订单取消、订单履行开始等)当然,当您只是进行数据挖掘时,订阅许多事件肯定会更加繁琐。但是,可以为这些场景实施其他技术。您可以发布特定事件和一般事件。如果使用事件源,事件处理器可以从事件流中提取相关事件并进行处理使用共享处理方法。与往常一样,在这些事情上需要实际一些:)我刚刚发现我可以使用逆变订阅,所以我只需要用一个接口标记我感兴趣的事件。
public class OrderCompletedEvent : IEvent
{
  public Guid OrderId { get; }
}
var subscription = DomainEvents
   .AsObservable<OrderCompletedEvent>()
   .Subscribe(OnOrderCompleted);