Angular 2 Inject Dependency outside Constructor
Ich beschäftige mich gerade mit DI in Angular 2. Ich implementiere einen REST-Client mit einem generischen Subtyp für konkrete Datentypen wie diesen:
class RESTClient<T>{
constructor() {
var inj = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);
this.http = inj.get(Http);
this.conf = RESTConfiguration;
}
}
class BookClient extends RESTClient<Book>{
constructor(){
// since I dont want to inject the HTTP Providers here, I'm using a custom injector in the super class
super();
}
}
class WriterClient extends RESTClient<Writer>{
...
...
}
So wie ich verstehe, wird es einen http-Dienst geben, der von allen RESTClients gemeinsam genutzt wird, die von den REST-Service-Superklassen injiziert werden.
Nun möchte ich eine RESTConfiguration-Klasse als solche haben:
@Injectable()
export class RESTConfiguration {
get baseURL() {
return this._baseURL;
}
set baseURL(value) {
alert("sets value to"+value);
this._baseURL = value;
}
private _baseURL;
}
Es sollte in der Haupt-App so konfiguriert sein:
initializeApp(){
this.restconf.baseURL = "http://localhost:3004/";
}
bootstrap(MyApp, [RESTConfiguration]).then();
Ich frage mich jetzt, wie ich eine Singleton-Instanz meiner RESTConfiguration in die RESTService-Klasse einfügen kann, ohne sie an den Konstruktor zu übergeben, den ich ohne Argumente verwenden möchte, um die Codeduplizierung zu verringern und Probleme mit Generika in Typenskript zu vermeiden.
Im obigen Beispiel (erstes Code-Snippet) versuche ich, meine Konfiguration mit dem von mir erstellten ReflectiveInjector zu injizieren, wodurch ich eine benutzerdefinierte Instanz meiner Konfiguration erhalte.
Ich dachte über verschiedene Lösungen nach:
Zugriff auf den "Global Injector" der Apps erhalten, indem einer über einen Dienst oder eine statische Klasseneigenschaft verfügbar gemacht wird
Implementieren zusätzlicher Singleton-Logik in meine Konfiguration
Finden Sie eine Möglichkeit, die winkelmässige native Injektionsmethode außerhalb des Konstruktors zu verwenden?
Gibt es Fehler in meinem Denken oder missbrauche ich das DI-Framework?