跨有界上下文(在单独的服务器上)的DDD域事件和事件处理程序的依赖注入
本文关键字:事件 DDD 事件处理 注入 依赖 程序 上下文 服务器 单独 | 更新日期: 2023-09-27 17:50:14
用Domain Events
做cross-Bounded Context (BC) communication
的选项或任何最佳实践方法是什么,可以使用Dependency Injection (DI)
在接收BC中创建Event Handlers
?BC在同一个局域网中,但是在不同的服务器上。理想情况下,每个BC中应该有一个端点,它将根据需要通过DI实例化正确的事件处理程序,而不是每个事件/事件处理程序有一个侦听器。
使用DI和本地事件处理程序,这样的简单示例将非常简单,只需最少的努力,然而,一旦您在其他服务器上使用http, tcp,消息队列等,则需要相当多的努力和/或库来简化管道。
如果你想的话,我觉得你可以做Udi的风格。我相信您可能想要混合本地域事件和跨界上下文事件?如果是这样的话,我猜所需的执行是源BC将引发像"OrderIsShipped"
这样的事件。此域事件可以有一个本地EventSubscriber
public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped>
{
...
Handle(...)
}
源BC应用层中的。但是,您的BC的应用程序层应该知道,如果这是发布在一个"总线"。
也许是DomainEventBusPublisher
类?有几种方法可以做到这一点。
你可以有另一个
PublishOrderIsShipped
类也实现接口IEventHandler<OrderIsShipped>
。这个类只是将事件发布(序列化)到NServiceBus端点或RabbitMQ端点。这里有一个经典的发布/订阅方法,这是最好的方法。事件以"即发即弃"的方式发布,这意味着发布者不知道谁在订阅。你可以用IoC容器(通用装饰器)装饰
SendNotificationWhenOrderIsShipped
事件处理程序,并像上面那样将事件发布到队列。缺点是您实际上需要一个事件处理程序来修饰。如果没有事件处理程序,那么你必须想出一个事件处理程序。在某种程度上感觉是被迫的。但是,如果应用程序希望在本地对应该发布到其他BC的每个域事件进行操作,则可以使用这种方法…你可以实现
public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
但这里的美妙之处在于你可以做一个泛型…
public class EventPublisher<T> : IEventPublisher<T>
在这里你可以注入RabbitMQ或NServiceBus包装到
EventPublisher
。如果你想做一些自定义动作,你可以关闭Open Generic EventPublisher。但我的建议是不要试图关闭它。如果你能保持这个纯粹的SOLID,并装饰EventPublisher
,例如错误处理或重新发布或传奇处理。但是最后一种方法要求你的静态
DomainEvents.Raise(...)
方法也在你的IoC容器中查看是否有任何注册的EventPublishers
。
也许这将在某种程度上帮助你?