我有一个分解为不同功能的angular 4应用程序。因此,我具有一个包含所有组件的购物功能以及具有所有组件的计费功能。
但是,我的配置有问题。我想在应用程序的多个功能之间共享配置。每个功能的配置都不同,因此我创建了一个基本配置类并从中继承。
但是在我的app.module中进行了如下注册。
{ provide: BillingModuleConfig, useClass: ConfigService },
{ provide: ShoppingConfig, useClass: ConfigService }
{
provide: APP_INITIALIZER,
useFactory: configServiceFactory,
deps: [ShoppingConfig],
multi: true
}
但是,这不适用于BillingModuleConfig。这意味着当我在需要的部分中注入BIllingConfig时,无法获得配置设置。有没有理由为什么这行不通?我的ConfigServiceFactory是一个外部函数,可按如下方式加载配置文件。
export function configServiceFactory(config: ConfigService) {
return () => config.load();
}
config.load方法将所有配置加载到继承自ShoppingConfig和BillingConfig的类中。
config.load实现是
import { Injectable, OnInit } from '@angular/core';
import { Http } from '@angular/http';
import { BillingModuleConfig} from '@razor/Billing';
import { ShoppingConfig } from '@razor/shopping';
import { environment } from './../../environments/environment';
import { HttpClient } from '@angular/common/http';
abstract class Settings implements BillingModuleConfig, ShoppingConfig {
public ShoppingAPIUrl: string;
public BillingApiUrl: string;
}
@Injectable()
export class ConfigService implements Settings {
constructor(private http: HttpClient) {}
public load() {
return new Promise((resolve, reject) => {
this.http
.get<Settings>(environment.configFileName)
.subscribe((config: AppSettings) => {
this.ShoppingAPIUrl= config.ShoppingAPIUrl;
this.BillingApiUrl= config.BillingApiUrl;
resolve(true);
});
});
}
}
最佳答案
考虑到config.load
将获取的配置分配给ConfigService
类实例,它仅适用于指定为APP_INITIALIZER
依赖项的提供程序令牌,即ShoppingConfig
。
为了在BillingModuleConfig
中提取配置,也应该指定配置:
{
provide: APP_INITIALIZER,
useFactory: configServiceFactory,
deps: [ShoppingConfig],
multi: true
},
{
provide: APP_INITIALIZER,
useFactory: configServiceFactory,
deps: [BillingModuleConfig],
multi: true
}
但是,这将导致两个请求。为避免这种情况,最简单的方法是在任何地方都使用
ConfigService
。如果引入BillingModuleConfig
和ShoppingConfig
是因为当前组合了配置,但应该稍后再进行划分,则它们可以重用公共实例:ConfigService,
{ provide: BillingModuleConfig, useExisting: ConfigService },
{ provide: ShoppingConfig, useExisting: ConfigService },
{
provide: APP_INITIALIZER,
useFactory: configServiceFactory,
deps: [ConfigService],
multi: true
}