У меня есть 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
?
ДЕМО стакблиц