angular - 在 Typescript 中扩展一个基类 vs 注入它
我正在开发一个 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 的依赖注入,你可以决定在什么层级引入它。
使用 extends 依赖于原生 ES6 语法,因此它可能更具可移植性。
所以我猜这主要是一个偏好问题,以及你是否认为你可能会在 Angular 之外使用你的代码。
同样,对于 extends,你将必须在每个调用父类的构造函数中调用 super()。如果你在意这个的话,这感觉不像 Angular 的方式...