使用cross-Bounded Context (BC) communication
与Domain Events
进行Dependency Injection (DI)
有哪些选项或最佳做法可以使用Event Handlers
在接收BC中创建{{1}}? BC位于同一个局域网中,但位于不同的服务器上。理想情况下,每个BC中应该有一个端点可以根据需要通过DI实例化正确的事件处理程序,而不是每个事件/事件处理程序都有一个侦听器。 / p>
像this simple example这样的东西对DI和本地事件处理程序来说很简单,但是一旦你在其他服务器上使用http,tcp,Message Queues等,它需要更多的工作量和/或库。缓解管道。
这适用于C#.NET环境。
答案 0 :(得分:1)
如果你愿意,我想你可以做Udi的风格。我相信您可能希望将本地域事件与跨界上下文事件混合使用?如果那样你我猜想所谓的执行是源BC将引发像"OrderIsShipped"
这样的事件。此域事件可以包含本地EventSubscriber
public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped>
{
...
Handle(...)
}
在Source BC应用程序层中。但是,你的BC应用程序层应该知道这是否是在&#34; Bus&#34;上发布的。
也许是DomainEventBusPublisher
课程?
有几种方法可以做到这一点。
您可以使用另一个PublishOrderIsShipped
类来实现接口IEventHandler<OrderIsShipped>
。此类只是将事件(序列化)发布到NServiceBus EndPoint或RabbitMQ端点。这是一种经典的发布/订阅方法,是最好的方法。事件以发射后的方式发布,这意味着发布者不知道谁订阅了。
您可以使用IoC容器(Generic Decorator)装饰SendNotificationWhenOrderIsShipped
事件处理程序,并将事件发布到队列,如上所述。缺点是你实际上需要一个事件处理程序来装饰。如果没有事件处理程序,那么你必须想出一个...它会以某种方式感觉到被迫。但是如果应用程序想要在每个应该发布到其他BC的域事件上进行本地操作,那么这种方法就可以了......
您可以实施
public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
但这里的美妙之处在于你可以做一个通用的......
public class EventPublisher<T> : IEventPublisher<T>
在这里,您可以将RabbitMQ或NServiceBus包装器注入EventPublisher
。然后,如果要进行一些自定义操作,可以关闭Open Generic EventPublisher。但我的建议是不要尝试关闭它。如果你能保持这个纯粹的SOLID并装饰EventPublisher
,例如错误处理或重新发布或Saga处理,那就更好了。
但最后一种方法要求,如果注册了DomainEvents.Raise(...)
,您的静态EventPublishers
方法也会在您的IoC容器中查找。
也许这会以某种方式帮助你?