1.開篇閑話
由於之前做的很多項目都沒接觸到這個,后來到了另一個公司,他們的代碼結構是基於領域驅動設計的,其中里面的對象都是通過依賴注入方式(Sprint.NET)實現的,也大致了解了哈,在網上搜了些資料來理解,網上有很多實現依賴注入的框架有很多,比如astle Windsor、Unity、Spring.NET、StructureMap,后續會對Unity和Spring.NET做介紹,以及自己用反射來實現各種方式的依賴注入。
2.原來你們是一家人
控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,它還有種叫法是依賴注入DI(Dependency Injection)。IoC是一種設計模式,是一種思想,相當於一個容器,而DI就好比是實現IOC的一種方式。所謂依賴注入,就是由IoC容器在運行期間,動態地將某種依賴關系注入到對象之中。這些是我的個人理解哈,如有不對的地方,還請大神些指導哈!
3.DI的實現方式(后續都會對各個注入方式做代碼展示的)
構造器注入(Constructor Injection):Ioc容器會智能地選擇選擇和調用合的構造函數以創建依賴的對象。如果被選擇的構造函數具有相應的參數,Ioc容器在調用構造函數之前解析注冊的依賴關系並自行獲得相應參數對象;
屬性注入(Property Injection):如果需要使用到被依賴對象的某個屬性,在被依賴對象被創建之后,Ioc容器會自動初始化該屬性;
方法注入(Method Injection):如果被依賴對象需要調用某個方法進行相應的初始化,在該對象創建之后,Ioc容器會自動調用該方法。
4.實例展示
就拿成都車展來說嘛,高科技的東西多,尤其是虛擬現實的體檢,很帶勁得。車展中有很多車展商,每個車展商有不同的車型,車展中的游客有要買車的和不買車的。根據這種情況做一下代碼的實現:
1 //人接口 2 public interface IPeople 3 { 4 void ViewCare(); 5 } 6 //要買車的人 7 public class PeopleWithBuyCar : IPeople 8 { 9 //可以通過注入實現指定的汽車服務商 10 private ICarVender carVender = null; 11 public PeopleWithBuyCar(ICarVender carVender) 12 { 13 this.carVender = carVender; 14 } 15 public void ViewCare() 16 { 17 ICar car = carVender.SaleCar(); 18 Console.WriteLine("汽車代號:" + car.carName + ",售價" + car.carPrice); 19 } 20 } 21 //汽車廠商接口 22 public interface ICarVender 23 { 24 ICar SaleCar(); 25 } 26 //大眾廠商 27 public class DaZhong : ICarVender 28 { 29 //可以通過注入實現指定的汽車服務商 30 private ICar car = null; 31 public DaZhong(ICar car) 32 { 33 this.car = car; 34 } 35 public ICar SaleCar() 36 { 37 return car; 38 } 39 } 40 //汽車接口 41 public interface ICar 42 { 43 string carName { get; } 44 double carPrice { get; } 45 } 46 //具體汽車信息 47 public class DaZhongCar : ICar 48 { 49 public string carName 50 { 51 get 52 { 53 return "大眾"; 54 } 55 } 56 57 public double carPrice 58 { 59 get 60 { 61 return 180000; 62 } 63 } 64 }
從上面的代碼可以看出,PeopleWithBuyCar依賴接口ICarVender、ICar,DaZhong依賴ICarVender和ICar,Car依賴ICar,這樣就符合依賴倒置原則了,都是依賴於對象的抽象,從而降低耦合度,方便后期的擴展。這里還沒說對象的注入,可以簡單的說一下,比如PeopleWithBuyCar類 需要依賴ICarVender接口,但是具體是ICarVender接口的哪一個實現類,就是通過注入來完成的,可以把DaZhong類對象注入給ICarVender,這樣就比較靈活,控制起來相對方便點。
5.小結
上面只是簡單的介紹了哈,也沒給過多的代碼的,后面再具體介紹每一種注入方式的時候,再詳細的說!謝謝大家咯!