天天看点

C#依赖注入

依赖注入的另外一个意思便是控制反转,也就是说将控制权交给被调用者。

依赖注入的用处便是减小模块化设计的耦合性,即增加可维护性。

假设我们有A,B两个模块,B要调用A来实现某种功能,通常最直接的做法是将A在B中创建实例:

ps:

interface IA{

void PlayMusic();

}

public A1:IA{

public void PlayMusic(){

console.WriteLine('轰轰轰');

}

}

public A2:IA{

public void PlayMusic(){

console.WriteLine('吼吼吼');

}

}

public class B{

var a= new A1;

public void PlayMusic(){

   a.PlayMusic();

}

}

这里有连个缺点:

缺点:A1与B的耦合性,需要播放音乐完全依赖于调用者B,这时假如IA有两个子类,但是按照上面的硬编码,B只能实现A1播放音乐的功能。

设想:如果我们将B的控制权交给被调用者IA,那么B要实现的播放功能由IA的实例决定,我传入A1的实例则播放A1的音乐,传入A2的实例则播放A2的音乐,控制权转交给IA,这时的耦合性降低了许多。

下面我们来看两种依赖注入的方式:

1、构造函数注入

public class B{

public IA a;

public B(IA a){

 this.a=a;

}

public void PlayMusic(){

a.PlayMusic();

}

}

2、属性注入

public class B{

public IA a{

get;

set;

}

public void PlayMusic(){

a.PlayMusic();

}

}

public class Main(){

B b=new B();

b.a=new A1();

b.PlayMusic();

}

以上创建的实例a都不是在B中硬编码,而是通过外部注入到B中的,从而将具体播放音乐的功能转移给外部注入到B中的a决定。

上面介绍的是依赖注入的概念性上的解释,有兴趣同学们可以去看spring.net资料,将依赖关系转移到config配置文件中,可以说是最大的程度转移了控制权。