【问题标题】:Extends a base class vs Inject it in Typescript扩展一个基类 vs 在 Typescript 中注入它
【发布时间】:2018-03-28 03:13:05
【问题描述】:

我正在开发一个 Angular 4 应用程序,我遇到了一种情况,我有一个 htpInterceptor 基础服务类,它具有 Typescript 通用 GET、POST 和 DELETE 功能。我希望我所有的角度服务都使用这个基类。现在我不确定是否应该将这个基础服务注入到我的所有服务中,或者我应该使用这个基础服务类扩展我的所有服务类。

我应该使用, 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());
    }
}

【问题讨论】:

  • 您是否考虑过迁移到 Angular 4.3 及更高版本中提供的较新的 HttpClient,并使用现成的 HttpInterceptor
  • @R.理查兹,我们的项目仍在使用 Angular 4.2,不过我们计划在未来几个月内将其迁移到 4.3。

标签: angular typescript


【解决方案1】:

利弊视情况而定。但是上面的代码是经典的组合与继承的困境。并且推荐的方式一般是composition over inheritance

在这种情况下,HttpInterceptorService 有望作为Http 的扩展替代品。所以应该注入而不是Http

如果AuthService 应该实现HttpInterceptorService 并扩展其功能(例如包装现有方法并添加身份验证标头),则它应该HttpInterceptorService 继承

【讨论】:

  • 我同意。谢谢。
【解决方案2】:

对于依赖于 Angular 的 DI 的导入服务,您可以决定要包含它的级别。

使用 extends 依赖于原生 ES6 语法,因此它可能更便携。

所以我想这主要是一个偏好问题,以及你是否认为你可以在 Angular 之外使用你的代码。

此外,您还必须在调用父类的每个构造函数中调用 super()。如果你关心的话,这感觉不像是 Angular 的方式......

【讨论】:

  • 我更喜欢注入而不是继承它,但您认为在性能方面有任何差异或使用一种方法与另一种方法的任何副作用。我也在我的问题中添加了我的基本服务类代码。
  • 我的偏好是在 Angular 项目中以 Angular 的方式做所有事情。我怀疑有任何显着的性能差异。
  • 我将暂时保留这个问题,以获得更多澄清。已添加基本服务代码,以防万一,它可能有助于有人提出更多的光。不过感谢您的投入。
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 2015-06-02
  • 2022-01-25
  • 2018-09-22
  • 2019-08-15
  • 2015-08-10
  • 1970-01-01
  • 2016-11-19
相关资源
最近更新 更多