2009-09-09 135 views
1

我正在研究在以前使用Castle Windsor的Web應用程序中使用Autofac。Autofac會話範圍

我真正喜歡Autofac的東西是能夠通過lamda表達式來表達動態組件構造,而不是在Windsor中創建DependancyResolvers等。

我有一個場景是我想要一個特定的組件在ASP.NET會話級作用域註冊。隨着溫莎我會創建/源的新LifestyleManager,但與Autofac我想出了這一點:

//Register SessionContext at HTTP Session Level 
builder.Register(c => 
{ 
    HttpContext current = HttpContext.Current; 

    //HttpContext handes delivering the correct session 
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext; 

    if (instance == null) 
    { 
     instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>(); 
     current.Session["SessionContext"] = instance; 
    } 

    return instance; 
}) 
.FactoryScoped(); 

這在某些時候我也許能變成一個擴展方法。如果HttpContext.Current.Session爲空,我接受此實現將會彈出,因爲它只應用於Web應用程序。

的問題是:

哪些是Autofac這種註冊的最佳實踐。我已經看到很多關於使用嵌套容器等的提及,但沒有具體的例子,並且我很想了解上述方法可能會出現什麼問題(只有我能想到的是自動處理的東西)。

謝謝。

回答

0

這看起來不錯。

標記組件'ExternallyOwned()'將確保Autofac不會對其調用Dispose()

這裏唯一的問題是你的會話範圍組件可以通過當前容器來解析它自己的依賴關係,從而持有對當前請求可能屬於的事物的引用(例如)。這應該很容易找到在測試中。

+0

嗨,尼克。感謝您的反饋,關於使用嵌套容器管理Web應用程序中的作用域,您是否知道任何具體示例,即Global.asx文件,這些文件將顯示每個容器的構建和「使用」位置?無法在文檔中看到它。 – crowleym 2009-09-10 09:06:17

+0

不確定它是100%最新的,但這應該有所幫助:http://code.google.com/p/autofac/source/browse/branches/1.4/src/Example/Remember.Web/Global。 asax.cs – 2009-09-11 01:32:14