跨有界上下文(在单独的服务器上)的DDD域事件和事件处理程序的依赖注入

本文关键字:事件 DDD 事件处理 注入 依赖 程序 上下文 服务器 单独 | 更新日期: 2023-09-27 17:50:14

Domain Eventscross-Bounded Context (BC) communication的选项或任何最佳实践方法是什么,可以使用Dependency Injection (DI)在接收BC中创建Event Handlers ?BC在同一个局域网中,但是在不同的服务器上。理想情况下,每个BC中应该有一个端点,它将根据需要通过DI实例化正确的事件处理程序,而不是每个事件/事件处理程序有一个侦听器。

使用DI和本地事件处理程序,这样的简单示例将非常简单,只需最少的努力,然而,一旦您在其他服务器上使用http, tcp,消息队列等,则需要相当多的努力和/或库来简化管道。

跨有界上下文(在单独的服务器上)的DDD域事件和事件处理程序的依赖注入

如果你想的话,我觉得你可以做Udi的风格。我相信您可能想要混合本地域事件和跨界上下文事件?如果是这样的话,我猜所需的执行是源BC将引发像"OrderIsShipped"这样的事件。此域事件可以有一个本地EventSubscriber

public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped> 
{
    ...
    Handle(...)
}
源BC应用层中的

。但是,您的BC的应用程序层应该知道,如果这是发布在一个"总线"。

也许是DomainEventBusPublisher类?有几种方法可以做到这一点。

  1. 你可以有另一个PublishOrderIsShipped类也实现接口IEventHandler<OrderIsShipped>。这个类只是将事件发布(序列化)到NServiceBus端点或RabbitMQ端点。这里有一个经典的发布/订阅方法,这是最好的方法。事件以"即发即弃"的方式发布,这意味着发布者不知道谁在订阅。

  2. 你可以用IoC容器(通用装饰器)装饰SendNotificationWhenOrderIsShipped事件处理程序,并像上面那样将事件发布到队列。缺点是您实际上需要一个事件处理程序来修饰。如果没有事件处理程序,那么你必须想出一个事件处理程序。在某种程度上感觉是被迫的。但是,如果应用程序希望在本地对应该发布到其他BC的每个域事件进行操作,则可以使用这种方法…

  3. 你可以实现

    public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
    

    但这里的美妙之处在于你可以做一个泛型…

    public class EventPublisher<T> : IEventPublisher<T>
    

    在这里你可以注入RabbitMQ或NServiceBus包装到EventPublisher。如果你想做一些自定义动作,你可以关闭Open Generic EventPublisher。但我的建议是不要试图关闭它。如果你能保持这个纯粹的SOLID,并装饰EventPublisher,例如错误处理或重新发布或传奇处理。

    但是最后一种方法要求你的静态DomainEvents.Raise(...)方法也在你的IoC容器中查看是否有任何注册的EventPublishers

也许这将在某种程度上帮助你?