控制反轉(IoC)、依賴注入(DI)、Autofacjava
一、 控制反轉(IoC)程序員
控制反轉(Inversion of Control)又稱IoC,不少資料上會把控制反轉和依賴注入(DI)放在一塊兒去說,本身在剛學的時候一直認爲他們是等同的概念,致使誤入歧途。百度百科上對控制反轉的解釋是:控制反轉(Inversion of Control,英文縮寫爲IoC)把建立對象的權利交給框架,是框架的重要特徵,並不是面向對象編程的專用術語。它包括依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。編程
控制反轉是一種思想,有的地方也叫設計模式。控制反轉的思想是把建立對象的權利由調用者轉變爲提供者。什麼意思呢?咱們在程序之中會常常去建立對象(new object()),若是把對象當成一項服務,那麼須要這項服務的就是調用者,提供這項服務的就是提供者。舉個例子:咱們都知道「一騎紅塵妃子笑」的故事,在這個故事中想吃荔枝的楊貴妃就是調用者,荔枝就是服務的提供者。可是荔枝遠在千里以外,楊貴妃要想吃到荔枝須要安排人馬不停蹄給他運過來。那麼運送的過程就是建立服務對象的過程,楊貴妃想吃到荔枝就須要本身去控制運送。這就是經典的調用者建立服務的過程。那麼控制反轉呢?顧名思義,就是把控制權進行反轉。服務的提供者來建立服務對象,調用者在須要的時候直接調用。也就是說荔枝摘下來的時候就運到宮中冷窖保存,等楊貴妃何時想吃就把荔枝拿出來。那麼冷窖就是咱們以後要說的容器。設計模式
既然控制反轉只是一種設計的思想,那麼實現這種思想的方式是什麼呢?框架
依賴查找:容器提供回調接口和上下文條件給組件。EJB和Apache Avalon 都使用這種方式。這樣一來,組件就必須使用容器提供的API來查找資源和協做對象,僅有的控制反轉只體如今那些回調方法上(也就是上面所說的 類型1):容器將調用這些回調方法,從而讓應用代碼得到相關資源。函數
依賴注入:組件不作定位查詢,只提供普通的Java方法讓容器去決定依賴關係。容器全權負責的組件的裝配,它會把符合依賴關係的對象經過JavaBean屬性或者構造函數傳遞給須要的對象。經過JavaBean屬性注射依賴關係的作法稱爲設值方法注入(Setter Injection);將依賴關係做爲構造函數參數傳入的作法稱爲構造器注入(Constructor Injection)ui
二、 依賴注入(DI)設計
如今經常使用的實現控制反轉的方式是依賴注入。依賴注入意思就是把對象之間的依賴關係注入到IoC容器中。這樣作的目的就是爲了解耦,以實現軟件設計的高內聚,低耦合。對象
依賴注入的方式有如下三種。接口
構造函數注入:
在構造期間完成一個完整的、合法的對象。全部依賴關係在構造函數中集中呈現。依賴關係在構造時由容器一次性設定,組件被建立以後一直處於相對「不變」的穩定狀態。只有組件的建立者關心其內部依賴關係,對調用者而言,該依賴關係處於「黑盒」之中。
Setter注入:
對於習慣了傳統 javabean 開發的程序員,經過 setter 方法設定依賴關係更加直觀。若是依賴關係較爲複雜,那麼構造子注入模式的構造函數也會至關龐大,而此時設值注入模式則更爲簡潔。若是用到了第三方類庫,可能要求咱們的組件提供一個默認的構造函數,此時構造子注入模式也不適用。
接口注入:
接口注入模式由於具有侵入性,它要求組件必須與特定的接口相關聯,所以並不被看好,實際使用有限。
三、 Autofac使用
容器
IContainer對象是Autofac的容器。容器的建立經過ContainerBuilder對象的Build()方法來建立。
注入依賴關係
ContainerBuilder對象將依賴關係注入到IContainer容器之中。
生成對象
經過IContainer對象的Resolve<T>()方法來獲取對象。
--未完待續,以後會經過實際的例子來講明Autofac的使用方式。