Внедрение сервиса в компонент, зависящий от контекста - PullRequest
0 голосов
/ 27 марта 2019

У меня есть такая структура

@Injectable()
export class A extends B ...

@Injectable()
export class C extends B ...

@Component({})
 constructor(
      @Inject(SERVICE) public data // How to inject component
  ) {
  }

Мне нужно динамически внедрить службу A или C в компонент

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я хочу добавить конкретную реализацию, которая расширяет B

В этом случае вам нужно только указать тип. Это может быть выведено из типа аргумента или может быть явно определено как аргумент в @Inject

constructor(private myService: C) { } 

или

constructor(@Inject(C) private myService: B) { } 
0 голосов
/ 27 марта 2019

попробуйте этот угловой reflectiveInjector https://angular.io/api/core/ReflectiveInjector

Это поможет получить услугу динамически.

Примечание: Не рекомендуется: с v5 - медленный и вводит много кода, вместо него используйте Injector.create.

Инжектор - это замена нового оператора, который может автоматически разрешать зависимости конструктора.

При обычном использовании код приложения запрашивает зависимости в конструкторе, и они разрешаются с помощью инжектора.

Попробуйте новый Injector:

import { Injector } from '@angular/core';

const injector = Injector.create([
  {
    provide: ASerive,
    useClass: ASerive,
    deps: [specify if any dependency]
  }
]);
const gotMySerive = injector.get(ASerive);

Измените создаваемые данные в соответствии с вашими потребностями

...