具有不同类的多个模块中相同InjectionToken的提供程序

时间:2018-07-03 23:48:42

标签: angular dependency-injection angular6

我有一个BaseComponent,需要使用Service_A注入Service_BInjectionToken

export const SERVICE_TOKEN = new InjectionToken<Service_A | Service_B>('ServiceInjector');

...

export class BaseComponent {
   constructor(
     @Inject(SERVICE_TOKEN)
     public service: Service_A | Service_B
   ) { }
}

有两个扩展BaseComponent的组件:Component_AComponent_B。 对于他们每个人,我想注入他们相应的服务。

如果我在组件级别使用DI提供程序,这将很好地工作:

@Component({
  selector: 'ui-component-a',
  templateUrl: `../base.component.html`,
  providers: [{
    provide: SERVICE_TOKEN,
    useClass: Service_A
  }]
})
export class Component_A extends BaseComponent { }
@Component({
   selector: 'ui-component-b',
   templateUrl: `../base.component.html`,
   providers: [{
     provide: SERVICE_TOKEN,
     useClass: Service_B
   }]
})
export class Component_B extends BaseComponent { }

但是,如果我将Component_AComponent_B放入自己的模块中并在模块级别使用依赖项提供程序,则两个组件最终都将注入相同的服务:

@NgModule({
  providers: [{
    provide: SERVICE_TOKEN,
    useClass: Service_A
  }],
  declarations: [
    Component_A
  ],
  exports: [
    Component_A
  ]
})
export class A_Module { }
@NgModule({
  providers: [{
    provide: SERVICE_TOKEN,
    useClass: Service_B
  }],
  declarations: [
    Component_B
  ],
  exports: [
    Component_B
  ]
})
export class B_Module { }

是否可以使用相同的InjectionToken解决具有不同类的多个模块中的依赖关系?

Stackblitz DEMO

0 个答案:

没有答案