我有通用服务。我想使用不同的类型=>
创建此服务的两个实例constructor(
private mapSynchService:
SynchronizatorService<SynchMapElement, SynchMapElementSubject>,
private waypointSynchService:
SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>) { }
问题,我以为这会创建两个不同的服务,原因是定义不同,但事实并非如此。但是我不太了解如何使这些服务在我的所有模块中可用,以及如何为需要服务1的组件提供正确的服务,以及为需要服务2的组件提供正确的服务。
我看到了一些有关注入令牌的文章,但是我的实现失败了。我在模块中尝试过类似的方法
providers:
[{provide:
new InjectionToken<SynchronizatorService<SynchWaypointElement, SynchWaypointElementSubject>>()}]
但是有很多错误
答案 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