Dot-Net

.NET 中帶有 Unity IOC 容器的 RabbitMQ

  • May 12, 2015

我使用 Unity App Block 作為 WCF 項目服務層的 IOC 容器。使用 Unity.WCF 庫將其插入到每個 WCF 服務中,這非常有效。

我最近將 RabbitMQ 引入了我的服務層,我目前正在使用“使用”塊來連接並添加到隊列中。不過我不喜歡這樣,我希望使用HierachicalLifetimeManager來創建和銷毀我與 RabbitMQ 的連接,因為我需要它們?這聽起來正確嗎?

我正在尋找一個樣本,或者至少有一些關於最佳方法的指導?(例如,我是否應該封裝連接並根據需要注入每個服務?我將如何封裝 RabbitMQ 消費者等?)

我建議將其註冊IConnection為單身人士。

IConnection在 Unity 中將 註冊為單例,您可以使用 a ContainerControlledLifetimeManager,例如

var connectionFactory = new ConnectionFactory
{
   // Configure the connection factory
};
unityContainer.RegisterInstance(connectionFactory);

unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(),
   new InjectionMethod("init"));

AutorecoveringConnection實例在第一次解決後將保持活動狀態,直到所有權UnityContainer被處置。

因為我們已經註冊了ConnectionFactorywith Unity,所以 this 會自動注入到 的建構子中AutorecoveringConnectionInjectionMethod確保第一次解析AutorecoveringConnectioninit呼叫該方法。

至於您是否應該從您的服務中抽像出 RabbitMQ 的問題,我的回答是肯定的,但是我不會簡單地創建一個IMessageQueue抽象。想想你使用消息隊列的目的是什麼,是推送狀態嗎?如果是這樣,IStatusNotifier請為 RabbitMQ 提供一個具有具體實現的介面。如果要獲取更新,請使用IUpdateSource帶有 RabbitMQ 的具體實現的介面。你可以看到我要去哪裡。

如果您為 Message Queue 創建抽象,則您將自己限制為僅在所有 Message Queue 實現中可用的功能。通過IStatusNotifier為不同的 Message Queue 實現提供不同的實現,您可以利用不同技術所獨有的特性,同時在將來採用完全不同的技術時保持靈活性(例如,寫入 SQL 數據庫或輸出到安慰)。

引用自:https://stackoverflow.com/questions/29985065