天天看點

對IOC/DI的了解(轉載自開濤的部落格)

                                             IOC

1. IoC: Inversion of Control,控制反轉, 控制權從應用程式轉移到架構(如IoC容器),是架構共有特性 .

1.1、為什麼需要IoC容器

  IoC(控制反轉)容器:容器主動控制

 本質:建立對象和裝配對象、管理對象生命周期

          被動執行個體化,被動接受依賴,被動裝配

        (工廠+反射+xml配置檔案)

 通用 

1.2、IoC容器特點

【1】無需主動new對象;而是描述對象應該如何被建立即可

         IoC容器幫你建立,即被動執行個體化;

【2】不需要主動裝配對象之間的依賴關系,而是描述需要哪個服務(元件),

        IoC容器會幫你裝配(即負責将它們關聯在一起),被動接受裝配;

【3】主動變被動,好萊塢法則:别打電話給我們,我們會打給你;

【4】迪米特法則(最少知識原則):不知道依賴的具體實作,隻知道需要提供某類服務的對象(面向抽象程式設計),松散耦合,一個對象應當對其他對象有盡可能少的了解,不和陌生人(實作)說話

【5】IoC是一種讓服務消費者不直接依賴于服務提供者的元件設計方式,是一種減少類與類之間依賴的設計原則。

 1.3、了解IoC容器問題關鍵:控制的哪些方面被反轉了?

     1、誰控制誰?為什麼叫反轉? ------ IoC容器控制,而以前是應用程式控制,是以叫反轉 

     2、控制什麼?               ------ 控制應用程式所需要的資源(對象、檔案……)

     3、為什麼控制?             ------ 解耦元件之間的關系 

     4、控制的哪些方面被反轉了? ------ 程式的控制權發生了反轉:從應用程式轉移到了IoC容器。

2.1、什麼是DI

   DI:依賴注入(Dependency Injection) :用一個單獨的對象(裝配器)來裝配對象之間的依賴關系 。 

2.2、了解DI問題關鍵

誰依賴于誰?           -------   應用程式依賴于IoC容器

為什麼需要依賴?        -------   應用程式依賴于IoC容器裝配類之間的關系

依賴什麼東西?          -------   依賴了IoC容器的裝配功能

誰注入于誰?            -------   IoC容器注入應用程式

注入什麼東西?          -------   注入應用程式需要的資源(類之間的關系)

更能描述容器其特點的名字——“依賴注入”(Dependency Injection)

IoC容器應該具有依賴注入功能,是以也可以叫DI容器 

2.3、DI優點

    【1】幫你看清元件之間的依賴關系,隻需要觀察依賴注入的機制(setter/構造器),就可以掌握整個依賴(類與類之間的關系)。

    【2】元件之間的依賴關系由容器在運作期決定,形象的來說,即由容器動态的将某種依賴關系注入到元件之中。

    【3】依賴注入的目标并非為軟體系統帶來更多的功能,而是為了提升元件重用的機率,并為系統搭建一個靈活、可擴充的平台。通過依賴注入機制,我們隻需要通過簡單的配置,而無需任何代碼就可指定目标需要的資源,完成自身的業務邏輯,而不用關心具體的資源來自何處、由誰實作

使用DI限制:元件和裝配器(IoC容器)之間不會有依賴關系,是以元件無法從裝配器那裡獲得更多服務,隻能獲得配置資訊中所提供的那些。 

2.4、實作方式

   1、構造器注入

   2、setter注入

   3、接口注入:在接口中定義需要注入的資訊,并通過接口完成注入

   其原理是基于OO設計原則的The Hollywood Principle:Don‘t call us, we’ll call you(别找我,我會來找你的)。也就是說,所有的元件都是被動的(Passive),所有的元件初始化和裝配都由容器負責。元件處在一個容器當中,由容器負責管理。

2.5 IoC容器功能:執行個體化、初始化元件、裝配元件依賴關系、負責元件生命周期管理。

 本質:

      IoC:控制權的轉移,由應用程式轉移到架構;

      IoC/DI容器:由應用程式主動執行個體化對象變被動等待對象(被動執行個體化);

      DI:  由專門的裝配器裝配元件之間的關系;

      IoC/DI容器:由應用程式主動裝配對象的依賴變應用程式被動接受依賴