Ricerca nel sito web

typescript - Angular 4 (AOT) + Electron e importazione condizionale


Nuovo in Angular/Typescript e sto lavorando su un'applicazione Desktop multipiattaforma usando Electron e Angular 4. Il problema che ho è che pianifico di usare un Service nei miei diversi componenti, ma voglio che questo servizio venga caricato da un file diverso a seconda della piattaforma su cui l'applicazione sta girando

Solo per farti capire cosa sto cercando di ottenere:

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

E quello che mi dà fastidio è che devo usare la compilazione AOT, quindi non posso usare require();

Spero che qualcuno abbia già affrontato questo tipo di problema e possa indicarmi la giusta direzione.

Risposta n. 1

Questo sembra un buon posto per usare un FactoryProvider finché entrambi i servizi hanno la stessa interfaccia. Questo pattern funziona con AOT in altre applicazioni su cui ho lavorato.

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

Puoi quindi importare e iniettare la classe astratta nei tuoi componenti dove necessario.

Sarebbe probabilmente meglio anche fornire il processo e iniettarlo nei dipendenti della fabbrica.