一 基本流程
服务或组件中注册服务提供商-->配置-->注入器-->把服务注入到-->组件中
组件通过constructor里面的DI令牌,到相应的注入器中,通过注入器中的DI令牌,找到对应的实例,然后注入到constructor里面的实例中
//DI令牌和它相关联的服务
providers:[{provide:AService,useClass:BService}]
constructor(
//实例与DI令牌
private aService:BService,
){}
二 服务提供商
1.表面解读
{ provide: Logger, useClass: BetterLogger }
前面一个键值对是用来找依赖,后面一个键值对是用来创建依赖
2.非类的依赖---useValue
//1.创建令牌---value.ts
export const AToken=new InjectionToken('a')//'a'是描述
//2.用创建好的令牌注册提供商
{provide:AToken,useValue:hero}
//3.把依赖注入到构造函数
constructor(
//前面没有private
@Inject(AToken) obj
){
//把依赖放到this上
this.myobj=obj
}
三 注入器
1.只要令牌和类,有一个不相同,就会产生新的实例
下面的例子显示了,令牌不一样,类相同,但是产生了不同的实例
providers:[
{provide:AService,useClass:AService},
{provide:BService,useClass:AService},
]
constructor(
private aService:AService,
private bService:BService,
){}
ngOnInit(){
this.aService.a=11
console.log('a',this.aService['a'],this.bService['a'])//11,1
}
2.当令牌不一样,想使用相同的实例,使用useExisting
providers:[
{provide:AService,useClass:AService},
{provide:BService,useExisting:AService},
]
四 服务实例
1.子组件能直接使用父组件注入器里面的实例
流程 父组件修改服务里面的值,然后取值,子组件修改服务里面的值,然后取值
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。