2014-03-13 18 views
1

有什麼選擇或做cross-Bounded Context (BC) communicationDomain Events可使用Dependency Injection (DI)創建在接受公元前Event Handlers的任何最佳實踐方法? BC在同一局域網中,但在不同的服務器上。理想情況下,每個BC中應該有一個端點,根據需要通過DI實例化正確的事件處理程序,而不是每個事件/事件處理程序都有一個偵聽器。DDD域事件跨越限界上下文(在不同的服務器)和依賴注入事件處理程序

類似this simple example的東西對於DI和本地事件處理程序來說很簡單,只需要很少的努力,但是一旦您在其他服務器上使用http,tcp,消息隊列等,它需要更多的努力和/或庫來緩解管道。

這將用於C#.NET環境。

回答

1

我認爲你可以做Udi的風格,如果你想。我相信你可能想混合本地域事件與跨界上下文事件?如果那樣的話,我想你所期望的執行是源BC會提出一個像"OrderIsShipped"這樣的事件。此域事件可以具有本地EventSubscriber

public class SendNotificationWhenOrderIsShipped : IEventHandler<OrderIsShipped> 
{ 
    ... 
    Handle(...) 
} 
在源BC應用層

。但是,無論您的卑詩省應用程序層是否應該知道這是否在「總線」上公佈。

也許DomainEventBusPublisher類? 有幾種方法可以做到這一點。

  1. 你可以有另一個PublishOrderIsShipped類也實現接口IEventHandler<OrderIsShipped>。這個類只是將事件發佈(序列化)到NServiceBus EndPoint或RabbitMQ End Point。這是一個經典的發佈/訂閱方法,是最好的方法。活動以一種即忘即忘的方式發佈,這意味着發佈商不知道誰在訂閱。

  2. 您可以用IoC容器(通用裝飾器)來裝飾SendNotificationWhenOrderIsShipped事件處理程序,並將事件發佈到上面的隊列中。缺點是你實際上需要一個事件處理程序來裝飾。如果沒有事件處理程序,那麼你必須拿出一個......這感覺在某種程度上被迫。但如果應用程序需要對那些應該被髮布到其他BC每個域事件在當地行動,這種做法可以離開去...

  3. 您可以實現

    public class BlaBlaBlaDomainEventPublisher : IEventPublisher<OrderIsShipped> 
    

    但這裏的美是你可以做一個通用的,而不是...

    public class EventPublisher<T> : IEventPublisher<T> 
    

    在這裏你可以注入你的RabbitMQ或NServiceBus包裝成EventPublisher。然後,如果您想進行一些自定義操作,可以關閉Open Generic EventPublisher。但我的建議是不要嘗試關閉它。更好,如果你可以保持這個純粹的固體並裝飾EventPublisher例如錯誤處理或重新發布或佐賀處理。

    但是,最後一種方法要求您的靜態DomainEvents.Raise(...)方法也會在您的IoC容器中查找,如果有任何EventPublishers已註冊。

也許這會幫助你以某種方式?