网站搜索

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 的方式...