如果你愿意,我认为你可以做 Udi 的风格。我相信您可能想将本地领域事件与跨界上下文事件混合在一起?如果是这样,我猜想要的执行是 Source BC 将引发类似"OrderIsShipped"
. 这个域事件可以有一个本地EventSubscriber
public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped>
{
...
Handle(...)
}
在 Source BC 应用层。但是,如果这是在“总线”上发布的,您的 BC 的应用层应该知道。
可能是一DomainEventBusPublisher
堂课?有几种方法可以做到这一点。
您可以拥有另一个PublishOrderIsShipped
也实现接口的类IEventHandler<OrderIsShipped>
。此类只是将事件发布(序列化)到 NServiceBus 端点或 RabbitMQ 端点。这是一种经典的发布/订阅方法,是最好的方法。事件以即发即弃的方式发布,这意味着发布者不知道谁在订阅。
您可以SendNotificationWhenOrderIsShipped
使用 IoC 容器(通用装饰器)装饰事件处理程序并将事件发布到上面的队列。缺点是你实际上需要一个事件处理程序来装饰。如果没有事件处理程序,那么您必须想出一个……这在某种程度上是被迫的。但是,如果应用程序想要对应该发布到其他 BC 的每个域事件进行本地操作,那么这种方法就可以不用了……
你可以实现一个
public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
但这里的美妙之处在于你可以做一个通用的......
public class EventPublisher<T> : IEventPublisher<T>
在这里,您可以将 RabbitMQ 或 NServiceBus 包装器注入EventPublisher
. 然后,如果您想进行一些自定义操作,您可以关闭 Open Generic EventPublisher。但我的建议是不要尝试关闭它。如果您可以保留这个纯 SOLID 并EventPublisher
使用例如错误处理或重新发布或 Saga 处理进行装饰,那就更好了。
但是最后一种方法要求您的静态DomainEvents.Raise(...)
方法也查看您的 IoC 容器(如果有任何EventPublishers
已注册)。
也许这会以某种方式帮助你?