我有一个分解为不同功能的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。如果引入BillingModuleConfigShoppingConfig是因为当前组合了配置,但应该稍后再进行划分,则它们可以重用公共实例:

ConfigService,
{ provide: BillingModuleConfig, useExisting: ConfigService },
{ provide: ShoppingConfig, useExisting: ConfigService },
{
  provide: APP_INITIALIZER,
  useFactory: configServiceFactory,
  deps: [ConfigService],
  multi: true
}

09-25 10:36