2017-11-10 15 views
1

私は別の機能に分解されている角度4アプリを持っています。だから私はすべてのコンポーネントとすべてのコンポーネントと請求機能を持つショッピング機能があります。角度の異なる4つのトークン同じ実装

ただし、設定に問題があります。私はアプリの複数の機能の間で設定を共有したいと思います。私の設定は機能ごとに異なりますので、基本設定クラスを作成して継承しました。

私のapp.moduleでは以下のような登録が行われました。

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

ただし、これはBillingModuleConfigでは機能しません。これは私がBIllingConfigを私が必要とするセクションに注入するときに設定設定を取得できないことを意味します。これがうまくいかない理由はありますか?私のConfigServiceFactoryは、以下のように設定ファイルをロードする外部関数です。

config.loadメソッドは、すべての設定をShoppingConfigとBillingConfigの両方から継承するクラスに読み込みます。

config.load実装はconfig.loadConfigServiceクラスインスタンスにフェッチ構成を割り当て、それだけShoppingConfigあるAPP_INITIALIZERの依存関係として指定されたプロバイダトークンのために働くことを考慮

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

あります。

BillingModuleConfigでフェッチされる構成のためには、それはあまりにも、指定する必要があります

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

しかし、これは2つの要求になります。これを避けるには、どこでもConfigServiceを使用するのが最も簡単な方法です。設定は現在、組み合わせが、後で分割することになっているので、BillingModuleConfigShoppingConfigが導入された場合、彼らは共通のインスタンスを再利用することができます答えを

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

感謝を。私はちょうどこれを試してみましたが、一部では機能しますが、すべてではありません。それが私の実装であるかどうかはわかりません。私は{ 提供:ErrorLoggingService、 useClass:ErrorLoggingService、 deps:[LoggingModuleConfig] }で設定の注入を使用していますが、これはGlobalErrorHandlerにこれを提供しているため、それはAPP_INITIALIZERの前に最初に読み込まれるようです。 – damola

+0

「部分的に」とは何ですか?これは、ErrorLoggingServiceとLoggingModuleConfigがどのように動作するかに依存しますが、質問には表示されません。 – estus

+0

謝罪私のせいです。私は同じに推論する必要がありますが。私は上記の貼り付けに大きなされているアプリの別の部分で同じユースケースを持っているので、私はちょうど給水ダウンバージョンを追加しました。私が部分的に意味していたことは、設定を必要とするすべての機能が動作していますが、GlobalErrorHandlerは私が除外したものではないということです。 – damola

関連する問題