2017-04-18 4 views
2

私は2種類のバックエンドを持つAngularアプリケーションで作業しています。アプリケーションが通常のWebページを介してロードされるときに使用されるものと、Cordovaアプリケーション内で使用されるものとがある。この目的は、アプリケーションの残りの部分がサービスを取得し、AJAX経由でクライアントまたはサーバーにデータを格納することに固有のサービスだけを知るようにすることです。条件に応じて異なる工場のセットを環境に基づいてAngularでロードする

明らかに私はシンボリックリンクや何かをロードする前に変更することでこれを行うことができましたが、実際には別の環境設定を使用して他のサービスをロードできるように設定したいと思っています。

各サービスには、「httpバックエンド」と「モバイルバックエンド」の2つのバージョンがあります。どちらのバージョンも同じ抽象基本クラスを拡張するか、同じインタフェースを実装します。

おそらく最も重要なのは、アプリケーションが使用されていないサービスセットのコードを読み込むべきではないということです。コードで返すサービスを決定するだけでは不十分です。

これを行うには良い方法がありますか?このような

答えて

2

何かが動作するはずです:

{ provide: <ServiceA>, useClass: <ServiceB>, deps: [<IMPORTANT for AoT>] } 

またはあなたの中にすべての依存関係を一覧表示することを確認します

const FirebaseProviders = [ 
    { provide: AuthService, useClass: FirebaseAuthService }, 
    { provide: ConnectionService, useClass: FirebaseConnectionService }, 
    { provide: CrudService, useClass: FirebaseCrudService }, 
    { provide: ErrorHandler, useClass: FirebaseErrorHandler, deps: [DataService, Store] }, 
    { provide: StorageService, useClass: FirebaseStorageService }, 
]; 

const MockProviders = [ 
    { provide: AuthService, useClass: MockAuthService }, 
    { provide: ConnectionService, useClass: MockConnectionService }, 
    { provide: CrudService, useClass: MockCrudService }, 
    { provide: ErrorHandler, useClass: AppErrorHandler, deps: [Store] }, 
    { provide: StorageService, useClass: StorageService }, 
]; 

const CoreProviders = environment.production ? FirebaseProviders : MockProviders; 

@NgModule({ 
    ... 
    providers: [ 
    ...CoreProviders, 
    DataService 
    ] 
}) 
export class CoreModule {} 

// service used in components/other services 
export class DataService<T> { 
    constructor(
    private connectionService: ConnectionService, 
    private crudService: CrudService, 
    private storageService: StorageService, 
    private store: Store<AppState>) {} 
} 

を、あなたはモジュールレベルの異なる実装を提供することができます厄介な(デバッグするのが難しい)AoTエラーになります。

+0

私は質問で明確にすべきでした。適切なプロバイダセットをロードするだけでは不十分です。プロバイダのサイズは重要ではないので、両方のセットのコードをロードする必要はありません。おそらく遅延ロードまたはデフォルトのビルドツールに結びついたメソッドが必要ですそれはAJAXプロバイダがコードバを必要とするときにはロードされません。特に、コードバプロバイダが通常のウェブサイトである場合はロードされません。 – taxilian

+0

プロダクションビルドでツリーシェイキングを行うCLIを使用します。例えば、 'const DEV_MODULES = environment.production? []:[DevModule] 'を呼び出してDEV_MODULESをインポートすると、バンドルサイズは開発モードでは+15.93KB **、実動では+ 80B **です。あなたはAjaxModule/CordovaModuleをセットアップし、環境に基づいてそれらをロードすることができます。 – Sasxa

+0

両方のケースでシングルビルドをしたい場合は、遅延ロードを使用してプロバイダを設定できます。 – Sasxa

関連する問題