TL;DR 25.10.16:更新
我重命名了标题以提供更多说明,因为我仍然担心正确的解决方案。
给定一个模块
@NgModule({
imports: [
ExternalModule.forRoot(config),
],
providers: [EXTERNAL_PROVIDERS(config)],
})
export class MyModule{}
所以我的问题是:我可以像这样通过传递的配置注入依赖项吗?
ExternalModule.forRoot(@Inject(MyConfig) config : MyConfig)
providers: [EXTERNAL_PROVIDERS(@Inject(MyConfig) config)]
(
我不想{provide: xxx, deps :[xxx], useFactory : xxx}
为每个给定的外部提供者创建。
我尝试按照此处Application Wide Service Locator
所述通过访问根注入器来初始化 a ,但是使用 Angular 2.1.0无法按预期工作。ngDoBootstrap
----------
旧帖:
我想知道在 Angular2 中配置外部第三方库提供程序的正确模式是什么。
举个例子(Typescript 中的代码示例):
有一个库公开了它的提供者,并通过config
对象字面量提供了一些配置选项:
export function THIRD_PARTY_PROVIDERS(config = {}): Provider[] {
return [
{
provide: ExtConfigurableService,
deps: [Http],
useFactory: (http: Http) => {
return new ExtConfigurableService(http, config);
}
},
ExtOtherService
];
}
然后在客户端,这些提供程序可以包含在@NgModule
:
@NgModule({
providers: [
THIRD_PARTY_PROVIDERS({foo : 'bar'})
],
})
export class ClientModule { }
但是,如果我的配置对象本身依赖于现有的服务,例如MyService
?我无法在提供程序数组中注入依赖项。从我的角度来看,唯一的方法是使用FactoryProvider:
const myConfigProvider = {
provide: MyConfig,
deps: [MyService],
useFactory: (MyService) => {
return new MyConfig(MyService);
}
};
鉴于此,我该如何MyConfig
注入THIRD_PARTY_PROVIDERS
?
我想出的唯一解决方案并不令人满意:
OpaqueToken
像这里一样使用从第三方提供方导出的(Angular 2 路由器)- 从客户端手动配置所有提供程序
第一个只能从第三方提供者完成:导出令牌并要求该令牌作为工厂提供者中自己的依赖项。
第二个就很丑了,因为第三方lib的实现细节/服务需要自己去了解和配置。
@NgModule({
providers: [
{provide: ExtConfigurableService, deps: [MyConfig], useFactory: ...},
ExtOtherService
],
})
export class ClientModule { }
angular 2(客户端和第三方提供商端)的首选模式是什么?
19.10.16 更新
我实施了我的第一个解决方案提案,并且效果很好。但它要求您控制外部库/同意项目所有者对您的更改或分叉 repo。
第三方-lib.ts:
export const JWT_CONFIGURATION = new OpaqueToken('THIRD_PARTY_PROVIDER_TOKEN');
...
@Injectable()
export class ExtConfigurableService {
constructor(@Inject(JWT_CONFIGURATION) config: any) {
// do someting with client provided config
}
我的模块.ts
@NgModule({
providers: [
{
provide: JWT_CONFIGURATION,
deps: [MyService],
useFactory: (mySvc: MyService) => {
return {foo : 'bar'};
}, THIRD_PARTY_PROVIDERS
]
})
export class MyModule { }
但是,如果外部库需要您将配置作为参数传递(如顶部的示例),我仍然不知道如何将 myconfig 注入其中。
@Inject()
除了构造函数或工厂提供者之外,Angular 是否还有其他方法可以注入依赖项?