2017-12-21 3 views
2

私は角4のアプリケーションで作業しています。私はhtpInterceptor Typescriptの一般的なGET、POST、およびDELETE関数を持つ基本サービスクラスを持っています。私はすべての角度のあるサービスにこの基本クラスを使用したい。今、私はこの基本サービスをすべてのサービスに注入するべきかどうか、またはすべてのサービスクラスをこの基本サービスクラスで拡張すべきかどうかはわかりません。これら二つのアプローチの違い(長所と短所)とは何であるベースクラスを拡張してTypescriptでそれを挿入する

私が使うべき、 export class AuthService extends HttpInterceptorService OR constructor(private _interceptor:HttpInterceptorService) { }

。続き

は、あなたが角度のDIに頼る輸入サービスでは

@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

Angular 4.3以降で利用可能な最新の 'HttpClient'に移行し、容易に利用できる[' HttpInterceptor'](https://angular.io/guide/http#advanced-usage)を使用しましたか? @ R。 –

+0

Richardsのプロジェクトではまだ4.2の角度を使用していますが、今後数ヶ月で4.3に移行する予定です。 – Akash

答えて

1

賛否両論はケースによります。しかし、上記のコードは、古典的な構成対継承のジレンマです。一般的には、推奨方法はcomposition over inheritanceです。

この場合、HttpInterceptorServiceは、Httpの拡張置換として機能することが期待されます。したがって、Httpの代わりにに注入する必要があります。

AuthServiceが(例えば、既存の方法をラップし、認証ヘッダーを追加)HttpInterceptorServiceを実装し、その機能を拡張することになっている場合、それはなければならないがHttpInterceptorServiceからを継承しました。

+0

私は同意します。ありがとう。 – Akash

1

、私のベースのサービスクラスである、あなたはそれを含めてどのレベルを決定します。

extendsを使用すると、ネイティブのES6構文が使用されるため、移植性が向上します。

だから、それはあなたのコードをAngular外で使うかもしれないと思いますか?

また、親クラスを呼び出すすべてのコンストラクタでsuper()を呼び出す必要があります。これはあなたが気にするならば、角度のように感じることはありません...

+0

私はそれを継承するのではなく、注入する方が好きですが、パフォーマンスに関して、またはあるアプローチを使用することによる副作用の違いがあります。私は私の質問に私の基本サービスのクラスコードを追加しています。 – Akash

+0

私の好みはAngularプロジェクトですべてのことを行うことです。重要なパフォーマンスの違いはないと私は考えています。 –

+0

私は、この問題をもう少し明確にするために、今のところ開いておきます。基本サービスコードを追加しました。その場合、誰かがもっと光を放つのに役立つかもしれません。あなたの入力をありがとう。 – Akash

関連する問題