.NET 中帶有 Unity IOC 容器的 RabbitMQ
我使用 Unity App Block 作為 WCF 項目服務層的 IOC 容器。使用 Unity.WCF 庫將其插入到每個 WCF 服務中,這非常有效。
我最近將 RabbitMQ 引入了我的服務層,我目前正在使用“使用”塊來連接並添加到隊列中。不過我不喜歡這樣,我希望使用
HierachicalLifetimeManager來創建和銷毀我與 RabbitMQ 的連接,因為我需要它們?這聽起來正確嗎?我正在尋找一個樣本,或者至少有一些關於最佳方法的指導?(例如,我是否應該封裝連接並根據需要注入每個服務?我將如何封裝 RabbitMQ 消費者等?)
我建議將其註冊
IConnection為單身人士。要
IConnection在 Unity 中將 註冊為單例,您可以使用 aContainerControlledLifetimeManager,例如var connectionFactory = new ConnectionFactory { // Configure the connection factory }; unityContainer.RegisterInstance(connectionFactory); unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(), new InjectionMethod("init"));該
AutorecoveringConnection實例在第一次解決後將保持活動狀態,直到所有權UnityContainer被處置。因為我們已經註冊了
ConnectionFactorywithUnity,所以 this 會自動注入到 的建構子中AutorecoveringConnection。InjectionMethod確保第一次解析AutorecoveringConnection時init呼叫該方法。至於您是否應該從您的服務中抽像出 RabbitMQ 的問題,我的回答是肯定的,但是我不會簡單地創建一個
IMessageQueue抽象。想想你使用消息隊列的目的是什麼,是推送狀態嗎?如果是這樣,IStatusNotifier請為 RabbitMQ 提供一個具有具體實現的介面。如果要獲取更新,請使用IUpdateSource帶有 RabbitMQ 的具體實現的介面。你可以看到我要去哪裡。如果您為 Message Queue 創建抽象,則您將自己限制為僅在所有 Message Queue 實現中可用的功能。通過
IStatusNotifier為不同的 Message Queue 實現提供不同的實現,您可以利用不同技術所獨有的特性,同時在將來採用完全不同的技術時保持靈活性(例如,寫入 SQL 數據庫或輸出到安慰)。