2017-07-29 11 views
2

角型/ Typescriptの新機能で、ElectronとAngular 4を使用してクロスプラットフォームのデスクトップアプリケーションを開発しています。 問題は、私の異なるコンポーネントが、私は、このサービスは、あなたは私が達成しようとしているかを理解するだけように、アプリケーションが角4(AOT)+電子と条件付きインポート

を実行しているプラ​​ットフォームに応じて、異なるファイルからロードされるようにしたい:

if (process.platform === 'darwin') { // Mac 
    import { MyService } from './path/to/the/mac/service/file'; 
} else if (process.platform === 'windows' { // Windows 
    import { MyService } from './path/to/the/windows/service/file'; 
} 

をそして、何が私を悩まします私はAOTコンパイルを使用する必要があるので、require()を使用することはできません。

誰かがすでにこの種の問題に直面していて、正しい方向に向けることを願っています。

+0

一般的な方法は、両方をインポートしてそれらの間で切り替えることです。 – estus

答えて

0

両方のサービスが同じインターフェイスを持つ限り、これはFactoryProviderを使用するのに適しているようです。このパターンは、私が取り組んできた他のアプリケーションのAOTで動作します。

import { FactoryProvider } from '@angular/core'; 
import { MyService as MySerivceWindows } from './path/to/the/windows/service/file'; 
import { MyService as MyServiceMac } from './path/to/the/mac/service/file'; 

export abstract class MyService{}; 

export function myFactoryProvider(){ 
     if (process.platform === 'darwin') { // Mac 
      return new MyServiceMac(); 
     }else{ 
      return new MySeviceWindows(); 
     } 
} 

const MY_SERVICE_PROVIDER: FactoryProvider = { 
    provide: MyService, 
    useFactory: myFactoryProvider 
}; 

次に、抽象クラスをインポートし、必要に応じてコンポーネントに注入できます。

また、プロセスを提供し、工場用のデープでも同様に注入することが最善の方法です。

+0

申し訳ありませんが、私がしようとしていることを達成するために、私はその2つの間を切り替えるためにどのようなアプローチをとっても、両方をインポートする必要があります。あなたの入力をありがとう;) – Driss

関連する問題