1. 程式人生 > 實用技巧 >控制反轉(IoC,Inverse of Control)和依賴注入(DI,Dependedency Injection)

控制反轉(IoC,Inverse of Control)和依賴注入(DI,Dependedency Injection)

概念與定義

一、控制反轉

1:類與類的依賴

依賴是面向物件中用來描述類與類之間一種關係的概念。兩個相對獨立的物件,當一個物件負責構造另一個物件的例項,或者依賴另一個物件的服務,這樣的兩個物件之間主要體現為依賴關係

2:控制反轉(IoC,Inverse of Control)

說反轉則要先說“正轉”,傳統中,在程式中使用new關鍵字配合建構函式去建立一個物件,這就是程式主動的建立其所依賴物件,這就是“正轉”。

呼叫者不自己建立被呼叫者物件,而交由第三方(容器)進行建立被呼叫者物件,這個過程稱為控制反轉(inversion of control,IOC)。

為什麼要控制反轉?控制反轉是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度,便於擴充套件和後期維護。

IoC的核心思想:在需要物件例項的時候,不要總考慮自己通過new來建立物件,放下依賴物件的建立過程,而是把建立物件的工作交給別人來負責,這個別人我們通常稱為容器 (Container)或者服務提供者 (ServiceProvider)

3:依賴注入(DI,Dependedency Injection)

實現控制反轉的主要方式是依賴查詢(Dependency Lookup,DL)依賴注入(DI,Dependedency Injection,DI)依賴注入是一種更可取的方式。

依賴注入具體是指:呼叫類 不主動建立依賴物件,而是使用容器來幫忙建立及注入依賴物件,這個過程就稱為依賴注入(Dependency Injection,DI

具體的說:Class A(呼叫類)中用到 Class B 型別的物件(依賴物件),通常情況下,我們在 Class A 中使用new關鍵字配合建構函式建立一個 Class B 的物件

但是,採用依賴注入技術之後, Class A只需要定義一個Class B型別的屬性,不需要直接new來獲得這個物件,而是通過IOC容器 將Class B型別的物件在外部new出來並注入到Class A裡的引用中,從而實現Class A和Class B解耦

二、控制反轉容器

1:IoC容器

在說到控制反轉時提到“使用IOC容器在 呼叫類 外部建立 依賴物件並注入到 呼叫類”,其中IOC容器是什麼?

IOC容器

就是具有依賴注入功能的容器,IOC容器負責例項化、定位、配置應用程式中的物件及建立這些物件間的依賴。從而,應用程式無需直接在程式碼中new相關的物件,應用程式由IOC容器進行組裝。

簡而言之,IOC容器主要就兩個作用:1、繫結服務與例項之間的關係2、對例項進行建立和銷燬

2:.NET最為流行的IoC容器框架

Unity:微軟patterns&practicest團隊開發的IOC依賴注入框架,支援AOP橫切關注點。

MEF(Managed Extensibility Framework):是一個用來擴充套件.NET應用程式的框架,可開發外掛系統。

Spring.NET:依賴注入、面向方面程式設計(AOP)、資料訪問抽象,、以及ASP.NET整合。

PostSharp:實現靜態AOP橫切關注點,使用簡單,功能強大,對目標攔截的方法無需任何改動。

Autofac:最流行的依賴注入和IOC框架,輕量且高效能,對專案程式碼幾乎無任何侵入性。