2017-12-21 4 views
2

Ich arbeite an einer eckigen 4 App und ich kam zu einer Situation, wo ich eine htpInterceptor Basis-Service-Klasse, die allgemeine GET, POST und DELETE-Funktionen hat. Ich möchte, dass alle meine eckigen Dienste diese Basisklasse verwenden. Jetzt bin ich mir nicht sicher, ob ich diesen Basisdienst in alle meine Dienste einspeisen sollte ODER ich sollte alle meine Dienstklasse um diese Basisdienstklasse erweitern.Verlängert eine Basisklasse vs injizieren in Typoskript

Sollte ich, export class AuthService extends HttpInterceptorService OR constructor(private _interceptor:HttpInterceptorService) { }

Was ist der Unterschied (Vor- und Nachteile) zwischen diesen beiden Ansatz.

Folgende ist meine Basis-Serviceklasse,

@Injectable() 
export class HttpInterceptorService { 

    constructor(private _http: Http) { } 

    get<T>(relativeUrl: ApiUrl): Observable<T> { 
     const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl; 
     let apiUrl = baseUrl + relativeUrl.toString(); 
     return this._http.get(apiUrl).map(res => <T>res.json()); 
    } 
    post<T>(relativeUrl: ApiUrl, inputData: any): Observable<T> { 
     const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl; 
     let apiUrl = baseUrl + relativeUrl.toString(); 
     if (inputData === undefined) { 
      return this._http.post(apiUrl, undefined).map(res => <T>res.json()); 
     } 
     else { 
      return this._http.post(apiUrl, inputData).map(res => <T>res.json()); 
     } 

    } 

    delete<T>(relativeUrl: string): Observable<T> { 
     const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl; 
     let apiUrl = baseUrl + relativeUrl; 
     return this._http.delete(apiUrl).map(res => <T>res.json()); 
    } 
} 
+0

Haben Sie erwogen, auf den neueren 'HttpClient' zu wechseln, der in Angular 4.3 und höher verfügbar ist und den leicht verfügbaren [' HttpInterceptor'] (https://angular.io/guide/http#advanced-usage) verwendet? –

+0

@R. Richards unser Projekt benutzt immer noch eckige 4.2, wir planen jedoch, es in den kommenden Monaten auf 4.3 zu migrieren. – Akash

Antwort

1

Pro und Kontra hängen vom Fall ab. Aber der Code oben ist klassische Zusammensetzung vs Vererbungsdilemma. Und der empfohlene Ansatz ist in der Regel composition over inheritance. In diesem Fall wird erwartet, dass HttpInterceptorService als erweiterter Ersatz für Http arbeitet. So sollte es statt Http injiziert werden.

Wenn AuthService soll HttpInterceptorService implementieren und seine Funktionalität erweitern (z bestehenden Methoden wickeln und Authentifizierungs-Header hinzufügen), sollte es sein von HttpInterceptorService geerbt.

+0

Ich stimme zu. Vielen Dank. – Akash

1

Mit einem importierten Service, den Sie auf Angular DI verlassen, entscheiden Sie, auf welcher Ebene es zu schließen.

Die Verwendung von extends beruht auf systemeigener ES6-Syntax, daher ist sie möglicherweise portabler.

Also ich denke, es ist vor allem eine Frage der Präferenz und ob Sie denken, dass Sie Ihren Code außerhalb Angular verwenden könnten.

Auch mit erweitert müssen Sie super() in jedem Konstruktor aufrufen, der die Elternklasse aufruft. Dies fühlt sich nicht wie die eckige Weise an, wenn Sie sich darum kümmern ...

+0

Ich bevorzuge es zu injizieren, anstatt es zu erben, aber denkst du, es gibt einen Unterschied in Bezug auf die Leistung oder einen Nebeneffekt der Verwendung eines Ansatzes gegenüber einem anderen. Ich füge meinen Base Service Class Code auch in meine Frage ein. – Akash

+0

Meine Vorliebe wäre, alles Winkelförmige in einem Angular-Projekt zu machen. Ich bezweifle, dass es einen signifikanten Leistungsunterschied gibt. –

+0

Ich werde diese Frage für jetzt offen halten, um mehr Klarheit darüber zu bekommen. Habe den Basis-Service-Code hinzugefügt, für den Fall, dass jemand mehr Licht werfen könnte. Danke für Ihre Eingaben. – Akash

Verwandte Themen