我有一个角度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);
});
});
}
}
答案 0 :(得分:1)
考虑到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
}