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.
