1

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

使用 DI 和本地事件处理程序,像这个简单的例子一样简单,只需很少的努力,但是一旦你在其他服务器上使用 http、tcp、消息队列等。它需要更多的努力和/或库来简化管道。

这适用于 C# .NET 环境。

4

1 回答 1

1

如果你愿意,我认为你可以做 Udi 的风格。我相信您可能想将本地领域事件与跨界上下文事件混合在一起?如果是这样,我猜想要的执行是 Source BC 将引发类似"OrderIsShipped". 这个域事件可以有一个本地EventSubscriber

public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped> 
{
    ...
    Handle(...)
}

在 Source BC 应用层。但是,如果这是在“总线”上发布的,您的 BC 的应用层应该知道。

可能是一DomainEventBusPublisher堂课?有几种方法可以做到这一点。

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

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

  3. 你可以实现一个

    public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
    

    但这里的美妙之处在于你可以做一个通用的......

    public class EventPublisher<T> : IEventPublisher<T>
    

    在这里,您可以将 RabbitMQ 或 NServiceBus 包装器注入EventPublisher. 然后,如果您想进行一些自定义操作,您可以关闭 Open Generic EventPublisher。但我的建议是不要尝试关闭它。如果您可以保留这个纯 SOLID 并EventPublisher使用例如错误处理或重新发布或 Saga 处理进行装饰,那就更好了。

    但是最后一种方法要求您的静态DomainEvents.Raise(...)方法也查看您的 IoC 容器(如果有任何EventPublishers已注册)。

也许这会以某种方式帮助你?

于 2014-03-14T09:07:01.067 回答