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" 可能那么一个通用事件就足够了。
但是,如果事件有任何特定的行为并且因此在系统中具有任何特定的含义,我肯定会建议采用更明确的方法。
我正在查看域事件,特别是 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" 可能那么一个通用事件就足够了。
但是,如果事件有任何特定的行为并且因此在系统中具有任何特定的含义,我肯定会建议采用更明确的方法。