typescript - Angular 4 (AOT) + Electron og betinget import


Ny til Angular/Typescript og jeg jobber med en tverrplattform Desktop-applikasjon ved bruk av Electron og Angular 4. Problemet jeg har er at jeg planlegger å bruke en Service i de forskjellige komponentene mine, men jeg vil at denne servicen skal lastes fra en annen fil avhengig av hvilken plattform applikasjonen kjører på.

Bare så du forstår hva jeg prøver å oppnå:

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';
} 

Og det som plager meg er at jeg må bruke AOT-kompilering, så jeg kan ikke bruke require();

Jeg håper noen allerede har møtt denne typen problem og kunne peke meg i riktig retning.

Svar #1

dette ser ut som et godt sted å bruke en FactoryProvider så lenge begge tjenestene har det samme grensesnittet. Dette mønsteret fungerer med AOT i andre applikasjoner jeg har jobbet med.

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
 };

Du kan deretter importere og injisere abstrakt klasse inn i komponentene dine der det er nødvendig.

Det ville også sannsynligvis være best å gi prosessen og injisere den også i avhengighetene for fabrikken.