我有以下情形:Unity不遵守TransientLifetimeManager?
A WCF
服務解決方案包含服務實現層,業務層和數據層。實現層取決於業務層和數據層上的業務層。每個圖層都通過構造函數注入來接收它的依賴關係。我們使用Unity將這一切連接起來。我們有一個自定義WCF
服務主機/因子/行爲/實例提供程序,它調用我們的Unity容器來解析要使用的WCF
服務以及它的各種依賴關係。
它工作得很好......差不多。
我們在我們的數據層中首先使用EntityFramework
代碼。我們所看到的是在初始調用WCF
時創建了一個新的DbContext類,但該類在後續對該服務的調用中被重用。當我們的服務正在服務多個同時訪問數據庫的調用時,這就成了一個問題。我能夠證明DbContext
類實際上是通過在DbContext類的構造函數中放置一些跟蹤語句來重用的。我走了更遠的鏈,並在業務層實現構造函數中放置類似的跟蹤語句,並發現這也只被調用一次。事實上,似乎只有服務實施正在構建在每個服務調用上,並且數據和業務層表現爲單身。
從我讀過的東西,這聽起來像默認行爲時使用RegisterType
與團結是使用TransientLifetimeManager
並認爲這意味着一個新的實例會在每次調用Resolve
創建。由於此默認行爲沒有出現錯誤,因此我們嘗試明確將終身管理器設置爲TransientLifetimeManager
,但我們仍然看到我們的業務層和數據層表現爲單身。
關於我需要做什麼才能讓我們的WCF
依賴項表現爲單例的任何想法?
更新:仍然沒有成功。我嘗試過使用PerResolveLifetimeManager,但是這並沒有解決問題。作爲一個臨時解決方案,我重構了我的代碼,以便將一個工廠注入到我的數據層中。工廠提供了DbContext實例,所以我可以確保每次調用我的數據層都使用新的DbContext。目前這個工作正常,但我想解決導致Unity保留的任何問題,並在創建它們之後重新使用實例。我們使用
默認生命時間管理器是ContainerControlledLifetimeManager http://msdn.microsoft.com/en-us/library/ff648098.aspx – onof 2011-02-01 11:17:36