Поставщик useFactory для отдельного экземпляра службы в модуле - PullRequest
1 голос
/ 22 апреля 2019

относится к этому

У меня есть следующий код

const MyType1Factory = () => {
  return new MyService<Type1>();
};

export let MyType1Provider =
{
  provide: MyService,
  useFactory: MyType1Factory,
};

и

const MyType2Factory = () => {
  return new MyService<Type2>();
};

export let MyType2Provider =
{
  provide: MyService,
  useFactory: MyType2Factory,
};

Теперь я пытаюсь внедрить два разных экземпляра этой службы в мой модуль, чтобы я мог получить доступ к своим двум экземплярам из любого компонента этого модуля

@NgModule({
  ...
  providers: [MyType1Provider , MyType2Provider ]
})

но я точно не знаю, как получить этот экземпляр в моем дочернем компоненте.

Кроме того, это правильная реализация?

РЕДАКТИРОВАТЬ:

Я также попытался добавить следующее в модуль

export const MyType2 = new InjectionToken<MyService<Type2>>('Type2');
export const MyType1 = new InjectionToken<MyService<Type1>>('Type1');

  providers: [
    { provide: MyType2, useFactory : MyType2Factory },
    { provide: MyType1 , useFactory: MyType1Factory }
]

и следующее в компоненте.

  constructor(@Inject(MyType2) private MyType2: MyService<Type2>,
              @Inject(MyType1 ) private MyType1 : MyService<Type1>) { }

но это даст мне

compiler.js: 2430 Uncaught Ошибка: не удается разрешить все параметры для NavigationIndexComponent: (?,?).

Вот блик стека https://stackblitz.com/edit/angular-htpqms

1 Ответ

0 голосов
/ 22 апреля 2019

В проекте stackblitz есть 2 проблемы

напишите useFactory вместо useClass, потому что вы используете фабричный метод, а не класс для реализации. Записать экземпляр токена в другой файл, не в app.module.ts, это вызывает циклическую зависимость, потому что app.module.ts импортирует файл my-component.component.ts, а my-component.component.ts импортирует app.module.ts, помещаем это, например, файл token.ts и импорт из app.module и my-component.component оттуда

     import { NgModule, InjectionToken } from '@angular/core';
     import { SynchronizatorService } from './synchronizator.service';


     export const SYNCH_STRING = new InjectionToken<SynchronizatorService<string, string>>('SynchMapToken');
    export const SYNCH_NUMBER = new InjectionToken<SynchronizatorService<number, number>>('SynchWaypointToken');
...