1、useClass
提供器的一种写法是这样的
providers: [...Service...],
其完全写法为
providers: [{provide:Service,useClass:Service}],
provide提供token而实际使用的服务为useClass声明的服务,下面这种
providers: [{provide:Service,useClass:anotherService}],
如果anotherService需要实现其他的类则要把类中的方法实现如:anotherService实现Service
Service类
import { Injectable } from '@angular/core';
@Injectable()
export class ServiceService {
constructor() { }
methods(){
console.log('第一种服务类')
}
}
anotherService类
import { Injectable } from '@angular/core';
import {ServiceService} from './service.service';
@Injectable()
export class AnotherServiceService implements ServiceService{
constructor() { }
methods(){
console.log('另一服务服务类')
}
anotherMethods(){
console.log('另一服务服务类')
}
}
同时服务之间也可以互相使用,前提是必须加上@Injectable()装饰器,
使用法跟组件中一样在构造函数中注入服务。
2、值
它的提供器的token为字符串,使用的是useValue,可以是一个对象,也可以是一个值
providers: [{provide:‘IS_Value’,useValue:false}],
注意在组件中获取的方式略有不同,data即为获取到的值
constructor(@Inject('IS_Value') private data) { }
3、工厂方法定义提供器
工厂方法只会被调用一次写法如下
provides:[
{
provide:ServiceService,
useFactory:()=>{
let dev=Math.random()>0.5
if(dev){
return new ServiceService()
}else {
return new AnotherServiceService()
}
}
}
]
如果工厂函数想要使用提供器的其他服务加入属性deps,并以参数的形式传入
provides:[
loggerService,
{
provide:ServiceService,
useFactory:(logger:loggerService)=>{
let dev=Math.random()>0.5
if(dev){
return new ServiceService(logger)
}else {
return new AnotherServiceService(logger)
}
}
deps:[loggerService]
}
]
这样就相当于实例化了loggerService,不过条件不简单的是通过一个随机数,我们也可以传进去一个值
provides:[
loggerService,
{provide:‘IS_Value’,useValue:false}
{
provide:ServiceService,
useFactory:(logger:loggerService,val)=>{
let dev=Math.random()>0.5
if(dev){
return new ServiceService(logger)
}else {
return new AnotherServiceService(logger)
}
}
deps:[loggerService,'IS_Value']
}
]
然后工厂函数会根据deps第二个值搜索并把它传给第二个参数