Ale*_*mov 10 dependencies dependency-injection dependency-management typescript angular
我有两个接口:
export interface IUserService {
...
}
export interface IUserStorageService {
...
}
Run Code Online (Sandbox Code Playgroud)
以及实现它们的单一服务:
@Injectable()
export class UserService implements IUserService, IUserStorageService {
...
}
Run Code Online (Sandbox Code Playgroud)
(这部分似乎与问题无关,所以只是为了完整性。我可以轻松地将接口转换为抽象类,以将它们直接用作令牌,而无需额外的注入令牌。)
现在,由于 Angular 不支持接口作为提供者的令牌,我必须创建注入令牌:
export let USER_SERVICE: InjectionToken<IUserService> = new InjectionToken<IUserService>("user.service");
export let USER_STORAGE_SERVICE: InjectionToken<IUserStorageService> = new InjectionToken<IUserStorageService>("user-storage.service");
Run Code Online (Sandbox Code Playgroud)
现在我可以将这些注入令牌全局映射到我的单个服务类app.module.ts:
@NgModule({
...
providers: [
{ provide: USER_SERVICE, useClass: UserService },
{ provide: USER_STORAGE_SERVICE, useClass: UserService }
],
...
})
export class AppModule {
...
}
Run Code Online (Sandbox Code Playgroud)
最后,我现在可以将不同接口下的服务注入到我的组件中:
// Some component - sees service's API as IUserService
constructor(@Inject(USER_SERVICE) private readonly userService: IUserService) {
}
// Another component- sees service's API as IUserStorageService
constructor(@Inject(USER_STORAGE_SERVICE) private readonly userStorageService: IUserStorageService) {
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是 Angular 实际上创建了 2 个实例UserService,每个令牌一个,而我需要UserService为每个应用程序创建一个实例。
我怎样才能做到这一点?
Dre*_*nai 11
我有一个非常相似的需求:我为许多组件提供服务 - 该服务有一个dispatchEvent功能和一个subscribeToEvents功能。我想清楚只有管理组件可以使用dispatchEvent(),所以服务有implements两个抽象类(这些可以用作令牌 - 这比注入令牌格式更清晰) - 一个有 dispatchEvents,另一个有 subscribeToEvents
providers: [
{provide: AbstractSettingsManager, useClass: SettingsEventService},
{provide: AbstractSettingsConsumer, useExisting: AbstractSettingsManager}
],
Run Code Online (Sandbox Code Playgroud)
您可以使用useExisting密钥,并记住它的意思是“使用现有的令牌”
该组件将都具有相同的ServiceEventService实例,但因为我提供AbstractSettingsManager/AbstractSettingsConsumer组件将只提供的服务功能的访问(通过打字稿检查),以一种或另一种
| 归档时间: |
|
| 查看次数: |
1439 次 |
| 最近记录: |