2011-01-31 103 views
2

我有以下情形:Unity不遵守TransientLifetimeManager?

A WCF服務解決方案包含服務實現層,業務層和數據層。實現層取決於業務層和數據層上的業務層。每個圖層都通過構造函數注入來接收它的依賴關係。我們使用Unity將這一切連接起來。我們有一個自定義WCF服務主機/因子/行爲/實例提供程序,它調用我們的Unity容器來解析要使用的WCF服務以及它的各種依賴關係。

它工作得很好......差不多。

我們在我們的數據層中首先使用EntityFramework代碼。我們所看到的是在初始調用WCF時創建了一個新的DbContext類,但該類在後續對該服務的調用中被重用。當我們的服務正在服務多個同時訪問數據庫的調用時,這就成了一個問題。我能夠證明DbContext類實際上是通過在DbContext類的構造函數中放置一些跟蹤語句來重用的。我走了更遠的鏈,並在業務層實現構造函數中放置類似的跟蹤語句,並發現這也只被調用一次。事實上,似乎只有服務實施正在構建在每個服務調用上,並且數據和業務層表現爲單身。

從我讀過的東西,這聽起來像默認行爲時使用RegisterType與團結是使用TransientLifetimeManager並認爲這意味着一個新的實例會在每次調用Resolve創建。由於此默認行爲沒有出現錯誤,因此我們嘗試明確將終身管理器設置爲TransientLifetimeManager,但我們仍然看到我們的業務層和數據層表現爲單身。

關於我需要做什麼才能讓我們的WCF依賴項表現爲單例的任何想法?

更新:仍然沒有成功。我嘗試過使用PerResolveLifetimeManager,但是這並沒有解決問題。作爲一個臨時解決方案,我重構了我的代碼,以便將一個工廠注入到我的數據層中。工廠提供了DbContext實例,所以我可以確保每次調用我的數據層都使用新的DbContext。目前這個工作正常,但我想解決導致Unity保留的任何問題,並在創建它們之後重新使用實例。我們使用

+0

默認生命時間管理器是ContainerControlledLifetimeManager http://msdn.microsoft.com/en-us/library/ff648098.aspx – onof 2011-02-01 11:17:36

回答

0

方式:

  1. 我們註冊我們的HierarchicalLifetimeManager(和其他服務)的DbContext。
  2. 在WCF實例中,我們提供了創建新的子控制器並解析來自此(子)容器的服務。與[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

  • 馬克服務,所以,HierarchicalLifetimeManager的魔力給了我們服務的新實例,併爲每個請求的所有相關數據。