Angular 4不同的令牌相同的Implemetation

时间:2017-11-10 09:00:59

标签: javascript 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);
        });
    });
  }
}

1 个答案:

答案 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。如果引入了BillingModuleConfigShoppingConfig,因为配置当前已合并但应该稍后进行划分,则可以重用一个公共实例:

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