举个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2。
那么,现在ClassA需要利用IB接口来做一些事情,例如:
不管是哪一种,都会让ClassA强依赖于IB的实现。
在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。
这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成:
那么,现在ClassA需要利用IB接口来做一些事情,例如:
public class ClassA {
public void DoSomething() {
IB b = ???
b.DoWork();
}
}
不管是哪一种,都会让ClassA强依赖于IB的实现。
在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。
这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成:
public class ClassA {
private IB b;
public ClassA(IB b) {
this.b = b;
}
public DoSomething() {
this.b.DoWork();
}
}
上面是依赖注入的所有内容。依赖注入不涉及任何反射、IoC框架(如Unity, Autofac)等内容。要注意这点。