TypeScript - Angular 4 (AOT) + Electron und bedingter Import
Neu bei Angular/Typescript und ich arbeite an einer plattformübergreifenden Desktop-Anwendung mit Electron und Angular 4. Das Problem, das ich habe, ist, dass ich plane, einen Service in meinen verschiedenen Komponenten zu verwenden, aber ich möchte, dass dieser Service aus einer anderen Datei geladen wird, abhängig von der Plattform, auf der die Anwendung läuft.
Nur damit Sie verstehen, was ich zu erreichen versuche:
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';
}
Und was mich stört, ist, dass ich AOT-Kompilierung verwenden muss, also kann ich require() nicht benutzen.
Ich hoffe, jemand hat sich schon mit diesem Problem auseinandergesetzt und kann mir den richtigen Weg zeigen.
Antwort #1
Dies scheint ein guter Ort zu sein, um einen FactoryProvider zu verwenden, solange beide Dienste dieselbe Schnittstelle haben. Dieses Muster funktioniert mit AOT in anderen Anwendungen, an denen ich gearbeitet habe.
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
};
Sie können dann die abstrakte Klasse importieren und in Ihre Komponenten injizieren, wo sie benötigt wird.
Es wäre wahrscheinlich auch am besten, den Prozess bereitzustellen und ihn ebenfalls in den Abhängigkeiten für die Fabrik zu injizieren.
