一 基本流程

服务或组件中注册服务提供商-->配置-->注入器-->把服务注入到-->组件中

组件通过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.子组件能直接使用父组件注入器里面的实例

流程 父组件修改服务里面的值,然后取值,子组件修改服务里面的值,然后取值


努力求学的人
108 声望2 粉丝