Angular DI:将价值代币注入工厂提供商

问题描述 投票:0回答:2

是否可以将 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"

有什么想法吗?

angular typescript dependency-injection
2个回答
13
投票

是的,您可以使用下面的

@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]
};

文档在这里


0
投票

在最新的 Angular 版本中,您可以执行以下操作:

export const YOUR_TOKEN = new InjectionToken<Type>('prefix-token', {
  factory: () => yourFunction(inject(ANOTHER_TOKEN || Service)),
});

© www.soinside.com 2019 - 2024. All rights reserved.