Провайдеры для одного и того же InjectionToken в нескольких модулях с разными классами - PullRequest
0 голосов
/ 04 июля 2018

У меня есть BaseComponent, который нужно ввести либо Service_A, либо Service_B, используя InjectionToken:

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_A и Component_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_A и Component_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?

ДЕМО стакблиц

...