|
1.依賴在哪里
老馬舉了一個小例子,是開發(fā)一個電影列舉器(MovieList),這個電影列舉器需要使用一個電影查找器(MovieFinder)提供的服務(wù),偽碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

2.DI的實現(xiàn)方式
和上面的圖1對應(yīng)的是,如果我們的系統(tǒng)實現(xiàn)了依賴注入,組件間的依賴關(guān)系就變成了圖2:圖2
說白了,就是要提供一個容器,由容器來完成(1)具體ServiceProvider的創(chuàng)建(2)ServiceUser和ServiceProvider的運行時綁定。下面我們就依次來看一下三種典型的依賴注入方式的實現(xiàn)。特別要說明的是,要理解依賴注入的機制,關(guān)鍵是理解容器的實現(xiàn)方式。本文后面給出的容器參考實現(xiàn),均為黃忠成老師的代碼,筆者僅在其中加上了一些關(guān)鍵注釋而已。
2.1 Constructor Injection(構(gòu)造器注入)
我們可以看到,在整個依賴注入的數(shù)據(jù)結(jié)構(gòu)中,涉及到的重要的類型就是ServiceUser, ServiceProvider和Assembler三者,而這里所說的構(gòu)造器,指的是ServiceUser的構(gòu)造器。也就是說,在構(gòu)造ServiceUser實例的時候,才把真正的ServiceProvider傳給他:
1

2

3

4

5

6

7

8

9

2.2 Setter Injection(設(shè)值注入)
這種注入方式和構(gòu)造注入實在很類似,唯一的區(qū)別就是前者在構(gòu)造函數(shù)的調(diào)用過程中進行注入,而它是通過給屬性賦值來進行注入。無怪乎PicoContainer和Spring都是同時支持這兩種注入方式。Spring對通過XML進行配置有比較好的支持,也使得Spring中更常使用設(shè)值注入的方式:

2

3

4

5

6

7

8

9

10

11

12

2.4 除了DI,還有Service Locator
上面提到的依賴注入只是消除ServiceUser和ServiceProvider之間的依賴關(guān)系的一種方法,還有另一種方法:服務(wù)定位器(Service Locator)。也就是說,由ServiceLocator來專門負責(zé)提供具體的ServiceProvider。當然,這樣的話ServiceUser不僅要依賴于服務(wù)的接口,還依賴于ServiceContract。仍然是最早提到過的電影列舉器的例子,如果使用Service Locator來解除依賴的話,整個依賴關(guān)系應(yīng)當如下圖所示:圖3
用起來也很簡單,在一個適當?shù)奈恢茫ū热缭谝唤M相關(guān)服務(wù)即將被調(diào)用之前)對ServiceLocator進行初始化,用到的時候就直接用ServiceLocator返回ServiceProvider實例:
1

2

3

4

5

6

7

8

9

it知識庫:深度理解依賴注入,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。