在我的角度应用程序中创建服务的双重实例

时间:2019-04-22 04:06:12

标签: angular service

我有通用服务。我想使用不同的类型=>

创建此服务的两个实例
constructor(
  private mapSynchService: 
SynchronizatorService<SynchMapElement, SynchMapElementSubject>,
  private waypointSynchService: 
SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>) { }

问题,我以为这会创建两个不同的服务,原因是定义不同,但事实并非如此。但是我不太了解如何使这些服务在我的所有模块中可用,以及如何为需要服务1的组件提供正确的服务,以及为需要服务2的组件提供正确的服务。

我看到了一些有关注入令牌的文章,但是我的实现失败了。我在模块中尝试过类似的方法

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

但是有很多错误

1 个答案:

答案 0 :(得分:1)

您将需要两个单独的注入令牌来提供单独的实例。

每个令牌都像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