在.NET上現在存在許多的依賴註入容器, 如:Castle Windsor、StructureMap、Autofac 、Unity。 這裡主要介紹一下Autofac,Autofac和其他容器的不同之處是它和C#語言的結合非常緊密,在使用過程中對你的應用的侵入性幾乎為零,更容易與第三方的組件集成。Au ...
在.NET上現在存在許多的依賴註入容器, 如:Castle Windsor、StructureMap、Autofac 、Unity。
這裡主要介紹一下Autofac,Autofac和其他容器的不同之處是它和C#語言的結合非常緊密,在使用過程中對你的應用的侵入性幾乎為零,更容易與第三方的組件集成。Autofac的主要特性如下:
1)靈活的組件實例化:Autofac支持自動裝配,給定的組件類型Autofac自動選擇使用構造函數註入或者屬性註入,Autofac還可以基於lambda表達式創建實例,這使得容器非常靈活,很容易和其他的組件集成。 var defaultLog = new ConsoleLog(); builder.Register(c => new Connection(){ Log = c.ResolveOptional<ILog>() ?? defaultLog });大家知道lambda表達式並不是在聲明的時候的執行的,只有等到容器的Resolve()方法調用的時候,表達式才執行。表達式還有一個好處是不需要使用反射或者是使用XML語法來表達。
2)資源管理的可視性:基於依賴註入容器構建的應用程式的動態性,意味著什麼時候應該處理哪些資源有點困難。Autofac通過跟蹤特定作用域內的實例和依賴來解決這個問題(DeterministicDisposal)。IDisposable介面是把雙刃劍,既是一個老孫手上的金箍棒,也是老孫頭上的魔咒,有一種明確的方式告訴哪一部分應該被清理,但是一個組件要何時處理並不是很容易確定的事情,比如說一個服務可以有多個實現的時候就變得很糟糕,組件的創建上(GOF的創建型設計模式)有的是通過工廠方式創建的,有的是單件方式創建的,有些需要被清理,有些卻不需要清理。組件的使用者無法知道是否應轉換IDisposable介面調用它的Disposal方法。Autofac通過容器來跟蹤組件的資源管理。對於不需要清理的對象,例如Console.Out,我們調用ExternallyOwned()方法告訴容器不用清理。細粒度的組件生命周期管理,應用程式中通常可以存在一個應用程式範圍的容器實例,在應用程式中還存在大量的一個請求的範圍的對象,例如一個HTTP請求,一個IIS工作者線程或者用戶的會話結束時結束。通過嵌套的容器實例和對象的作用域使得資源可視化。
3)Autofac的設計上非常務實,這方面更多是為我們這些容器的使用者考慮:
- 組件侵入性為零:組件不需要去引用Autofac;
- 靈活的模塊化系統:通過模塊化組織你的程式,應用程式不用糾纏於複雜的XML配置系統或者是配置參數;
- 自動裝配:可以是用lambda表達式註冊你的組件,autofac會根據需要選擇構造函數或者屬性註入;
- XML配置文件的支持:XML配置文件過度使用時很醜陋,但是在發佈的時候通常非常有用;
- 組件的多服務支持:許多設計師喜歡使用細粒度的介面來控制依賴 , autofac允許一個組件提供多個服務;
參考資料:
http://alexmg.com/?tag=/autofac
https://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac
源碼下載地址https://github.com/autofac/Autofac
參考鏈接:http://www.cnblogs.com/shanyou/archive/2010/02/07/1665451.html