AutofacIoC依賴注入容器
Autofac和其他容器的不同之處是它和C#語言的結(jié)合非常緊密,在使用過程中對你的應(yīng)用的侵入性幾乎為零,更容易與第三方的組件集成。
Autofac的主要特性如下:
- 靈活的組件實(shí)例化:Autofac支持自動裝配,給定的組件類型Autofac自動選擇使用構(gòu)造函數(shù)注入或者屬性注入,Autofac還 可以基于lambda表達(dá)式創(chuàng)建實(shí)例,這使得容器非常靈活,很容易和其他的組件集成。
var defaultLog = new ConsoleLog(); builder.Register(c => new Connection(){ Log = c.ResolveOptional<ILog>() ?? defaultLog });大家知道lambda表達(dá)式并不是 在聲明的時(shí)候的執(zhí)行的,只有等到容器的Resolve()方法調(diào)用的時(shí)候,表達(dá)式才執(zhí)行。表達(dá)式還有一個(gè)好處是不需要使用反射或者是使用XML語法來表 達(dá)。 - 資源管理的可視性:基于依賴注入容器構(gòu)建的應(yīng)用程序的動態(tài)性,意味著什么時(shí)候應(yīng)該處理那些資源有點(diǎn)困難。Autofac通過跟蹤特 定作用域內(nèi)的實(shí)例和依賴來解決這個(gè)問題(DeterministicDisposal)。IDisposable接口接口是把雙刃劍,既是一個(gè)老孫手上 的金箍棒,也是老孫頭上的魔咒,有一種明確的方式告訴那一部分應(yīng)該被清理,但是一個(gè)組件要何時(shí)處理并不是很容易確定的事情,比如說一個(gè)服務(wù)可以有多個(gè)實(shí)現(xiàn) 的時(shí)候就變得很糟糕,組件的創(chuàng)建上(GOF的創(chuàng)建型設(shè)計(jì)模式)有的是通過工廠方式創(chuàng)建的,有的是單件方式創(chuàng)建的,有些需要被清理,有些卻不需要清理。組件 的使用者無法知道是否把轉(zhuǎn)換為IDisposable接口調(diào)用它的Disposal方法。Autofac通過容器來跟蹤組件的資源管理。對于不需要清理的 對象,例如Console.Out,我們調(diào)用ExternallyOwned()方法告訴容器不用清理。細(xì)粒度的組件生命周期管理:應(yīng)用程序中通??梢源?在一個(gè)應(yīng)用程序范圍的容器實(shí)例,在應(yīng)用程序中還存在大量的一個(gè)請求的范圍的對象,例如一個(gè)HTTP請求,一個(gè)IIS工作者線程或者用戶的會話結(jié)束時(shí)結(jié)束。 通過嵌套的容器實(shí)例和對象的作用域使得資源的可視化。
- Autofac的設(shè)計(jì)上非常務(wù)實(shí),這方面更多是為我們這些容器的使用者考慮:
- 組件侵入性為零:組件不需要去引用Autofac。
- 靈活的模塊化系統(tǒng):通過模塊化組織你的程序,應(yīng)用程序不用糾纏于復(fù) 雜的XML配置系統(tǒng)或者是配置參數(shù)。
- 自動裝配:可以是用lambda表達(dá)式注冊你的組件,autofac會根據(jù)需要選擇構(gòu)造函數(shù)或者屬 性注入
- XML配置文件的支持:XML配置文件過度使用時(shí)很丑陋,但是在發(fā)布的時(shí)候通常非常有用
- 組件的多服務(wù)支持:許 多設(shè)計(jì)師喜歡使用細(xì)粒度的接口來控制依賴 , autofac允許一個(gè)組件提供多個(gè)服務(wù)。
評論
圖片
表情
