依賴注入和依賴注入容器
為了降低代碼耦合程度,提高項目的可維護性,Yii采用多許多當下最流行又相對成熟的設計模式,包括了**依賴注入**(Denpdency Injection, DI)和**服務定位器**(Service Locator)兩種模式。 關于依賴注入與服務定位器, Inversion of Control Containers and the Dependency Injection pattern 給出了很詳細的講解,這里結合Web應用和Yii具體實現進行探討,以加深印象和理解。 這些設計模式對于提高自身的設計水平很有幫助,這也是我們學習Yii的一個重要出發點。
有關概念:
**依賴倒置原則**(Dependence Inversion Principle, DIP)
DIP是一種軟件設計的指導思想。傳統軟件設計中,上層代碼依賴于下層代碼,當下層出現變動時, 上層代碼也要相應變化,維護成本較高。而DIP的核心思想是上層定義接口,下層實現這個接口, 從而使得下層依賴于上層,降低耦合度,提高整個系統的彈性。這是一種經實踐證明的有效策略。
**控制反轉**(Inversion of Control, IoC)
IoC就是DIP的一種具體思路,DIP只是一種理念、思想,而IoC是一種實現DIP的方法。 IoC的核心是將類(上層)所依賴的單元(下層)的實例化過程交由第三方來實現。 一個簡單的特征,就是類中不對所依賴的單元有諸如 $component = new yii\component\SomeClass() 的實例化語句。
依賴注入(Dependence Injection, DI)
DI是IoC的一種設計模式,是一種套路,按照DI的套路,就可以實現IoC,就能符合DIP原則。 DI的核心是把類所依賴的單元的實例化過程,放到類的外面去實現。
**控制反轉容器**(IoC Container)
當項目比較大時,依賴關系可能會很復雜。 而IoC Container提供了動態地創建、注入依賴單元,映射依賴關系等功能,減少了許多代碼量。 Yii 設計了一個 yii\di\Container 來實現了 DI Container。
**服務定位器**(Service Locator)
Service Locator是IoC的另一種實現方式, 其核心是把所有可能用到的依賴單元交由Service Locator進行實例化和創建、配置, 把類對依賴單元的依賴,轉換成類對Service Locator的依賴。 DI 與 Service Locator并不沖突,兩者可以結合使用。 目前,Yii2.0把這DI和Service Locator這兩個東西結合起來使用,或者說通過DI容器,實現了Service Locator。