首先说下控制反转(ioc)
只把它认为思想就可以了,就像是面向对象思想,它的思想就是把引用代码的控制权,移交到外部,然后再通过外部注入进来,
举个简单的例子:
A类需要使用B类,则A类需要直接引用B类,现在我们不去直接获取了,而是通过一个容器去获取B类的实例,然后再通过容器传给A类这个过程叫注入,而这个容器则为ioc容器,它是一个能实现这种功能的框架,(angular就是一种)
依赖注入
上面介绍了控制反转, 如果明白了控制反转,那么依赖注入其实就是实现控制反转的手段,即这个容器要想实现这种功能需要通过依赖注入的方式,简单解释为应用程序依赖容器创建并注入它所需要的外部资源;
意义
为什么要这样做?
同样举个例子:
export class AExa {}
export class BExa {}
export class CExa {
public a:AExa;
public b:BExa;
constructor(){
this.a=new AExa();
this.b=new BExa();
}
}
要想实现实例CExa则需要在它内部构建AExa和BExa实例,
现在我们想为AExa添加一个参数》》》DExa实例,
export class AExa {
constructor(new DExa()){
}
}
export class BExa {}
export class CExa {
public a:AExa;
public b:BExa;
constructor(){
this.a=new AExa(new DExa());
this.b=new BExa();
}
}
export class DExa {}
AExa改变了,我们最终需要的CExa 也改变了,实际项目中肯定比这复杂
依赖注入方式则只关心CExa,它需要什么直接在构造函数中注入就可以
代码变为这样
export class CExa {
public a:AExa;
public b:BExa;
constructor(private aMid:AExa,private bMid:BExa){
this.a=aMid;
this.b=bMid;
}
}
这是angular的方式通过在构造函数中声明,来说明需要的依赖,angular已经在底层做了大量初始化工作,需要哪个注入哪个,这样做的好处是消除耦合增加可复用性