我認爲你可以做Udi的風格,如果你想。我相信你可能想混合本地域事件與跨界上下文事件?如果那樣的話,我想你所期望的執行是源BC會提出一個像"OrderIsShipped"
這樣的事件。此域事件可以具有本地EventSubscriber
public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped>
{
...
Handle(...)
}
在源BC應用層
。但是,無論您的卑詩省應用程序層是否應該知道這是否在「總線」上公佈。
也許DomainEventBusPublisher
類? 有幾種方法可以做到這一點。
你可以有另一個PublishOrderIsShipped
類也實現接口IEventHandler<OrderIsShipped>
。這個類只是將事件發佈(序列化)到NServiceBus EndPoint或RabbitMQ End Point。這是一個經典的發佈/訂閱方法,是最好的方法。活動以一種即忘即忘的方式發佈,這意味着發佈商不知道誰在訂閱。
您可以用IoC容器(通用裝飾器)來裝飾SendNotificationWhenOrderIsShipped
事件處理程序,並將事件發佈到上面的隊列中。缺點是你實際上需要一個事件處理程序來裝飾。如果沒有事件處理程序,那麼你必須拿出一個......這感覺在某種程度上被迫。但如果應用程序需要對那些應該被髮布到其他BC每個域事件在當地行動,這種做法可以離開去...
您可以實現
public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped>
但這裏的美是你可以做一個通用的,而不是...
public class EventPublisher<T> : IEventPublisher<T>
在這裏你可以注入你的RabbitMQ或NServiceBus包裝成EventPublisher
。然後,如果您想進行一些自定義操作,可以關閉Open Generic EventPublisher。但我的建議是不要嘗試關閉它。更好,如果你可以保持這個純粹的固體並裝飾EventPublisher
例如錯誤處理或重新發布或佐賀處理。
但是,最後一種方法要求您的靜態DomainEvents.Raise(...)
方法也會在您的IoC容器中查找,如果有任何EventPublishers
已註冊。
也許這會幫助你以某種方式?