是否可以将 InjectionToken 注入到工厂提供程序中:
目前,我已经编码:
export const HOST_TOKEN = new InjectionToken<string>("host");
let configDataServiceFactory = (userService: UserService, host: string) => {
return new Config("host", 8080, userService.getUser(), userService.getPasswd());
};
export let configDataServiceProvider =
{
provide: CONFIG_API,
useFactory: configDataServiceFactory,
deps: [UserService, HOST_TOKEN]
};
进入我的模块:
@NgModule(
providers: [
{provide: HOST_TOKEN, useValue: "allianz-host"},
configDataServiceProvider
]
)
尽管如此,角度正在注入
configDataServiceProvider
值"host"
,而不是"host-allianz"
有什么想法吗?
是的,您可以使用下面的
@Inject
装饰器来做到这一点,这将帮助您从 DI 容器中提取相关依赖项。
let configDataServiceFactory = (userService: UserService, @Inject(HOST_TOKEN) host: string) => {
return new Config(host, 8080, userService.getUser(), userService.getPasswd());
};
您也可以考虑以下选项。基本上所有已注册的
InjectionToken
都可以从应用程序 Injector
中检索,这可以通过在 get
实例上调用 injector
方法并传递 InjectorToken
名称来实现。
export const HOST_TOKEN = new InjectionToken<string>("host");
let configDataServiceFactory = (userService: UserService, injector: Injector) => {
let host = injector.get(HOST_TOKEN); //retrieved token from injector
return new Config(host, 8080, userService.getUser(), userService.getPasswd());
};
export let configDataServiceProvider =
{
provide: CONFIG_API,
useFactory: configDataServiceFactory,
deps: [UserService, Injector]
};
在最新的 Angular 版本中,您可以执行以下操作:
export const YOUR_TOKEN = new InjectionToken<Type>('prefix-token', {
factory: () => yourFunction(inject(ANOTHER_TOKEN || Service)),
});