angular - 在 Typescript 中擴展基類與注入它
我正在開發一個 Angular 4 應用程式,遇到一個情況,我有一個 htpInterceptor 基本服務類,它有 TypeScript 泛型的 GET、POST 和 DELETE 函數。我希望我所有的 Angular 服務都使用這個基類。現在我不確定我應該將這個基服務注入到我所有的服務中,還是應該讓所有的服務類繼承這個基服務類。
我應該使用 export class AuthService extends HttpInterceptorService 還是 constructor(private _interceptor:HttpInterceptorService) { }
這兩種方法之間的差異(優缺點)是什麼。
以下是我的基礎服務類別,
@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());
}
}
答案#1
利弊取決於具體情況。但上面的代碼是經典的組合與繼承困境。而通常推薦的方法是優先使用組合而非繼承。
在這種情況下,HttpInterceptorService 預期作為 Http 的擴展替代方案來運作。因此它應該被 注入,而不是 Http。
如果 AuthService 應該實現 HttpInterceptorService 並擴展其功能(例如:包裝現有方法並添加認證標頭),它應該從 HttpInterceptorService 繼承。
答案#2
使用匯入的服務時,你依賴 Angular 的依賴注入(DI),並決定在哪個層級包含它。
使用 extends 依賴原生 ES6 語法,因此它可能更具可移植性。
所以我想這主要是偏好問題,以及你是否認為你可能會在 Angular 之外使用你的程式碼。
另外,在使用 extends 時,你必須在每個調用父類的構造函數中調用 super()。如果你在意這點,這感覺不像 Angular 的方式…