2009-08-20 55 views
3

爲ASP.NET應用程序創建Dependency Injection容器非常普遍,因此它在應用程序處於活動狀態時處於活動狀態。每個請求的依賴注入容器

我在每個請求中創建DI容器,並在請求結束時釋放它。
主要目的是任何DI容器支持處置容器時的Disposing對象。


附加:如果我需要請求(NHibernate的SessionFactory的)之間共享資源,我只是讓他們在一個靜態變量,在每次請求的對象封裝了價值。像這樣:

public class SessionFactoryAggregator : ISessionFactory { 
    static ISessionFactory actualFactory; 

    // Implement ISessionFactory and proxy calls to the actualFactory 
} 

這只是模擬的singleton模式。


我的問題:

  1. 它是確定這樣做呢?
  2. 如果不是爲什麼,應該做些什麼呢?
  3. 此方法中的任何已知性能問題?

更新:在我使用溫莎城堡通過我自己的DI提供商的抽象的時刻,所以實際的容器是可插拔的。

謝謝。

回答

4

它是否適合你,那是因爲Web應用程序的無狀態特性的確定:)

,這樣做不應該給你的任何功能性問題,因爲你只是打算讓每個請求的容器,並且多個實例將簡單地彼此獨立生活。

從可擴展性角度來看,這可能不是最有效的方法(但請記住,你應該測量性能,而不是猜測),因爲應用程序將被連接最多和破壞資源的大量可能同樣也被分享了。

大多數DI容器都具有管理對象生命週期的能力,它們中的大多數甚至可以在Web上感知,這意味着您應該能夠告訴它某些組件具有「每請求」生命週期,並且它們應該在每次請求後處理。

這將允許您保持其他組件作爲單身(活動模式,而不是創建模式),以便它們可以在多個請求之間共享。對於通常是線程安全的數據訪問組件來說,這通常是一個好主意,因爲它們不包含可變狀態。