1

我們有實現IMessageService.RegisterHandler<T>(Func<IMessage<T>, object>)的邏輯。在消息隊列的執行塊中,我們使用Funq.Container自動連線服務。服務的屬性是依賴注入的,但似乎是在線程之間共享的。屬性類定義爲:ServiceStack:IMessageService中的依賴注入對象的生命週期

_Container.RegisterAutoWired<DbConnectionManager>().ReusedWithin(Funq.ReuseScope.Request); 

大多數情況下,DbConnectionManager屬性是作爲新對象創建的。但是,在一些非常繁忙的時間裏,我們注意到DbConnectionManager在線程間重用並導致問題。

我的問題是:什麼是依賴注入的對象,這是由兩個Web請求和消息隊列使用的生命週期設置?關於我們遇到的這個特殊問題的任何見解?太感謝了!

回答

0

請勿將請求範圍用於MQ請求。如果相關性是線程使用默認的單登記:

container.RegisterAutoWired<DbConnectionManager>(); 

否則,如果它不是線程安全的,其註冊爲一過性的依賴:

container.RegisterAutoWired<DbConnectionManager>().ReusedWithin(ReuseScope.None); 
+0

感謝@mythz。這證實了我對問題原因的懷疑。但是,在這種DbConnectionManager也被很多普通服務使用的情況下(我們需要爲每個請求保留一個實例),我無法想到其他方式,而是創建一個單獨的DbConnectionManagerForMQ類來使用ReuseScope.None。那是建議的嗎? –

+0

@JamesChen使用請求範圍幾乎總是一個壞主意,要麼依賴是線程安全的,在這種情況下使用單例,或者它不是在這種情況下使用瞬態。當您需要單例依賴API背後的性能實現池時,並在使用後立即將實例釋放回池中,從而最大限度地減少資源爭用。如果您需要在整個請求管道中共享對象,請使用'IRequest.Items'字典。我想不出使用請求範圍的一個好理由。 – mythz

+0

我們有一些不同的邏輯,它們在自己的代碼塊中執行數據庫操作。當我們將它們組合在一個層次結構中時,我們希望有一個DbConnection和Transaction,因此我們將此DbConnectionManager作爲DbConnection封裝器引入,以避免嵌套事務。瞬態類型不能以這種方式工作。我也在考慮使用ReuseScope.Container並在Web請求和MQ中管理子容器。你認爲這是一個有效的方法? –