1.開篇閑話 由于之前做的很多項(xiàng)目都沒接觸到這個(gè),后來到了另一個(gè)公司,他們的代碼結(jié)構(gòu)是基于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的,其中里面的對(duì)象都是通過依賴注入方式(Sprint.NET)實(shí)現(xiàn)的,也大致了解了哈,在網(wǎng)上搜了些資料來理解,網(wǎng)上有很多實(shí)現(xiàn)依賴注入的框架有很多,比如astle Windsor、Unity、Spring.NET、StructureMap,后續(xù)會(huì)對(duì)Unity和Spring.NET做介紹,以及自己用反射來實(shí)現(xiàn)各種方式的依賴注入。 2.原來你們是一家人 控制反轉(zhuǎn)(Inversion of Control,英文縮寫為IoC)是一個(gè)重要的面向?qū)ο缶幊?/a>的法則來削減計(jì)算機(jī)程序的耦合問題,它還有種叫法是依賴注入DI(Dependency Injection)。IoC是一種設(shè)計(jì)模式,是一種思想,相當(dāng)于一個(gè)容器,而DI就好比是實(shí)現(xiàn)IOC的一種方式。所謂依賴注入,就是由IoC容器在運(yùn)行期間,動(dòng)態(tài)地將某種依賴關(guān)系注入到對(duì)象之中。這些是我的個(gè)人理解哈,如有不對(duì)的地方,還請(qǐng)大神些指導(dǎo)哈! 3.DI的實(shí)現(xiàn)方式(后續(xù)都會(huì)對(duì)各個(gè)注入方式做代碼展示的) 構(gòu)造器注入(Constructor Injection):Ioc容器會(huì)智能地選擇選擇和調(diào)用合的構(gòu)造函數(shù)以創(chuàng)建依賴的對(duì)象。如果被選擇的構(gòu)造函數(shù)具有相應(yīng)的參數(shù),Ioc容器在調(diào)用構(gòu)造函數(shù)之前解析注冊(cè)的依賴關(guān)系并自行獲得相應(yīng)參數(shù)對(duì)象; 屬性注入(Property Injection):如果需要使用到被依賴對(duì)象的某個(gè)屬性,在被依賴對(duì)象被創(chuàng)建之后,Ioc容器會(huì)自動(dòng)初始化該屬性; 方法注入(Method Injection):如果被依賴對(duì)象需要調(diào)用某個(gè)方法進(jìn)行相應(yīng)的初始化,在該對(duì)象創(chuàng)建之后,Ioc容器會(huì)自動(dòng)調(diào)用該方法。 4.實(shí)例展示 就拿成都車展來說嘛,高科技的東西多,尤其是虛擬現(xiàn)實(shí)的體檢,很帶勁得。車展中有很多車展商,每個(gè)車展商有不同的車型,車展中的游客有要買車的和不買車的。根據(jù)這種情況做一下代碼的實(shí)現(xiàn): 1 //人接口
2 public interface IPeople
3 {
4 void ViewCare();
5 }
6 //要買車的人
7 public class PeopleWithBuyCar : IPeople
8 {
9 //可以通過注入實(shí)現(xiàn)指定的汽車服務(wù)商
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('汽車代號(hào):' car.carName ',售價(jià)' car.carPrice);
19 }
20 }
21 //汽車廠商接口
22 public interface ICarVender
23 {
24 ICar SaleCar();
25 }
26 //大眾廠商
27 public class DaZhong : ICarVender
28 {
29 //可以通過注入實(shí)現(xiàn)指定的汽車服務(wù)商
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,這樣就符合依賴倒置原則了,都是依賴于對(duì)象的抽象,從而降低耦合度,方便后期的擴(kuò)展。這里還沒說對(duì)象的注入,可以簡(jiǎn)單的說一下,比如PeopleWithBuyCar類 需要依賴ICarVender接口,但是具體是ICarVender接口的哪一個(gè)實(shí)現(xiàn)類,就是通過注入來完成的,可以把DaZhong類對(duì)象注入給ICarVender,這樣就比較靈活,控制起來相對(duì)方便點(diǎn)。 5.小結(jié) 上面只是簡(jiǎn)單的介紹了哈,也沒給過多的代碼的,后面再具體介紹每一種注入方式的時(shí)候,再詳細(xì)的說!謝謝大家咯! |
|