回頭再學Asp.net系列--基礎篇(六)
2011-10-21 21:41 熬夜的蟲子 閱讀(357) 評論(0) 收藏 舉報隨著面向對象分析與設計的發展,一個良好的設計,核心原則之一就是將變化隔離,使得變化部分發生變化時,不變部分不受影響(這也是OCP的目的)。為了做到這一點,要利用面向對象中的多態性,使用多態性后,客戶類不再直接依賴服務類,而是依賴于一個抽象的接口,這樣,客戶類就不能在內部直接實例化具體的服務類。
但是,客戶類在運作中又客觀需要具體的服務類提供服務,因為接口是不能實例化去提供服務的。就產生了“客戶類不準實例化具體服務類”和“客戶類需要具體服務類”這樣一對矛盾。
依賴注入(Dependency Injection),是這樣一個過程:由于某客戶類只依賴于服務類的一個接口,而不依賴于具體服務類,所以客戶類只定義一個注入點。在程序運行過程中, 客戶類不直接實例化具體服務類實例,而是客戶類的運行上下文環境或專門組件負責實例化服務類,然后將其注入到客戶類中,保證客戶類的正常運行。
Setter注入(Setter Injection)是指在客戶類中,設置一個服務類接口類型的數據成員,并設置一個Set方法作為注入點,這個Set方法接受一個具體的服務類實例為參數,并將它賦給服務類接口類型的數據成員。構造注入(Constructor Injection)是指在客戶類中,設置一個服務類接口類型的數據成員,并以構造函數為注入點,這個構造函數接受一個具體的服務類實例為參數,并將它賦給服務類接口類型的數據成員。
上面提到的注入方式,都是客戶類被動接受所依賴的服務類,這也符合“注入”這個詞。不過還有一種方法,可以和依賴注入達到相同的目的,就是依賴獲取。
可以看到,這種方法變被動為主動,使得客戶類在需要時主動獲取服務類,而將多態性的實現封裝到獲取點里面。獲取點可以有很多種實現,也許最容易想到 的就是建立一個Simple Factory作為獲取點,客戶類傳入一個指定字符串,以獲取相應服務類實例。如果所依賴的服務類是一系列類,那么依賴獲取一般利用Abstract Factory模式構建獲取點,然后,將服務類多態性轉移到工廠的多態性上,而工廠的類型依賴一個外部配置,如XML文件。
不過,不論使用Simple Factory還是Abstract Factory,都避免不了判斷服務類類型或工廠類型,這樣系統中總要有一個地方存在不符合OCP的if…else或switch…case結構,這種缺 陷是Simple Factory和Abstract Factory以及依賴獲取本身無法消除的,而在某些支持反射的語言中(如C#),通過將反射機制的引入徹底解決了這個問題
依賴獲取(Dependency Locate)是指在系統中提供一個獲取點,客戶類仍然依賴服務類的接口。當客戶類需要服務類時,從獲取點主動取得指定的服務類,具體的服務類類型由獲取點的配置決定。
![]() |
原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網安備 33010602011771號