什么是依赖注入我就不解释了,很多编程语言里面都有,在angular中如何使用学会就好。在angular中使用依赖注入有了个名词,一个叫注入器,另一个叫提供器。
注入器:将通过组建的构造函数注入组建所需要的对象。
constructor(private myService: MyService){...}
上面的代码,我们申明了一个myService的服务,在这个属性上我们指明了这个属性的类型是MySercice. Angular会在整个应用中寻找一个MySercice的实例对象,如果被找到就会自动注入给myService对象。如果没找到,就会异常报错。
上面讲到要去找一个实例对象,那这个对象我们如何提供给他,让它能够得到实例化对象。我们这个过程叫设置提供器。
通常我们在组建或者模块中声明一个提供器。
providers:[MyService]
上面这行提供器的声明等同于
providers:[{provide: MyService, useClass: MyService}]
它的意思就是provide的token是MyService,它的useClass类型也是MyService,这样就可以向上面那样简写。useClass是决定类型,如果类型不一样,那就不能简写。如
providers:[{provide: MyService, useClass: OtherServiceClass}]
提供器还有一种写法,useClass参数变成一个工厂函数
provides: [{
prpvode: ProductService,
useFactory: (logger: Logger Service, appConfig) =>{
is(appConfig.isDev){
return new ProductService(logger);
}else{
return new AnotherProductService(logger);
}
},
dips:[LoggerService, "IS_DEV_ENV"]
}, LoggerService,
{
provide: "APP_CONFIG", useValue: {isDev: false}
}
],
提供器作用域:
1.当声明在模块中(@NgModule)的提供器,对所有组建可见,整个应用有效;
2.当生命在组建中(@componnt)的提供器,只对该组建,以及该组建的子组建有效;
3.当声明在模块中和组建中的提供器具有相同的token,那么组建中的提供器会覆盖掉模块中的提供器;
4.通常我们优先把提供器声明在模块中,而不是组建中,除非这个提供器不想对其他组建可见。