Создайте двойной экземпляр службы в моем угловом приложении - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть общий сервис.Я хотел бы создать два экземпляра этого сервиса с различным типом =>

constructor(
  private mapSynchService: 
SynchronizatorService<SynchMapElement, SynchMapElementSubject>,
  private waypointSynchService: 
SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>) { }

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

Я виделкакой-то пост о токене инъекции, но моя реализация не удалась.Я пытался что-то подобное в модуле

providers: 
  [{provide: 
    new InjectionToken<SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>>()}]

Но получил много ошибок

1 Ответ

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

Для предоставления отдельных экземпляров вам понадобятся два отдельных токена инъекций.

Каждый токен работает как уникальное имя для сопоставления значения / класса / фабрики для контейнера Angular DI. Также убедитесь, что служба помечена как @Injectable, чтобы Angular распознал ее.

Пример:


// Export unique Injection Token

export const SYNCH_MAP = new InjectionToken<SynchronizatorService<SynchMapElement, SynchMapElementSubject>>('Token for SynchMap');
export const SYNCH_WAYPOINT = new InjectionToken<SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>>('Token for SynchWaypoint');

// Using at a module level

@NgModule({
    ...
    providers: [
        { provide: SYNCH_MAP, useClass: SynchronizatorService<SynchMapElement, SynchMapElementSubject> }
        { provide: SYNCH_WAYPOINT, useClass: SynchronizatorService<SynchMapElement, SynchMapElementSubject> }
    ]
})


// Injecting in a component 

constructor(
    @Inject(SYNCH_MAP) private instance1: SynchronizatorService<SynchMapElement, SynchMapElementSubject>,
    @Inject(SYNCH_WAYPOINT) private instance2: SynchronizatorService<SynchMapElement, SynchMapElementSubject>,
)

IMO, было бы лучше использовать useFactory провайдера для большего контроля инициализации экземпляров службы. Как я полагаю, ваше определение сервиса использует шаблон <T>. Пожалуйста, посмотрите на https://angular.io/guide/dependency-injection-providers#predefined-tokens-and-multiple-providers

...