Wyszukiwanie w witrynie

typescript - Angular 4 (AOT) + Electron i warunkowy import


Nowy w Angular/Typescript i pracuję nad aplikacją desktopową typu cross-platform przy użyciu Electron i Angular 4. Problem, który mam, polega na tym, że planuję używać usługi w różnych komponentach, ale chcę, aby ta usługa była ładowana z innego pliku w zależności od platformy, na której działa aplikacja

Tylko żebyś zrozumiał, co próbuję osiągnąć :

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

A to, co mnie martwi, to fakt, że muszę używać kompilacji AOT, więc nie mogę używać require();

Mam nadzieję, że ktoś już zetknął się z takim problemem i mógłby mnie nakierować we właściwym kierunku.

Odpowiedź #1

To wydaje się być dobre miejsce na użycie FactoryProvidera, o ile obie usługi mają ten sam interfejs. Ten wzorzec działa z AOT w innych aplikacjach, nad którymi pracowałem.

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

Możesz następnie zaimportować i wstrzyknąć klasę abstrakcyjną do swoich komponentów tam, gdzie jest to potrzebne.

Prawdopodobnie najlepiej byłoby również zapewnić proces i wstrzyknąć go także w zależnościach dla fabryki.