Angular/TypeScript 将服务注入基类,但不注入子类



我有一个基本的ServiceBase类,它将Http注入构造函数:

import { Headers, Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';
export abstract class ServiceBase<T> {
    constructor(private http: Http) {
    }
    protected getData(url: string): Promise<T> {
        return this.http.get(url).toPromise()
            .then(response => response.json() as T)
            .catch(this.handleError);
    }
    private handleError(error: any): Promise<any> {
        console.log('An error occurred', error);
        return Promise.reject(error.message || error);
    }
}

然后由子类扩展:

@Injectable()
export class WeatherService extends ServiceBase<Weather> {
    constructor(http: Http) {
        super(http);
    }
    getWeather(): Promise<Weather> {
        return this.getData('api/weather');
    }
}

但是,我想避免将Http注入到我所有的子类中,并通过调用将参数传递到父类中super(http);这可能吗?我只需要在基类中注入Http,因为子类都将从使用该服务的父类调用方法。

是的,使用反射式注射器是可能的。

import { Headers, Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';
export abstract class ServiceBase<T> {
    protected http: Http;
    
    constructor() {
      const injector = ReflectiveInjector.resolveAndCreate([
      Http,
      BrowserXhr,
      {provide: RequestOptions, useClass: BaseRequestOptions},
      {provide: ResponseOptions, useClass: BaseResponseOptions},
      {provide: ConnectionBackend, useClass: XHRBackend},
      {provide: XSRFStrategy, useFactory: () => new CookieXSRFStrategy()},
    ]);
     this.http = injector.get(Http);
    }
    protected getData(url: string): Promise<T> {
        return this.http.get(url).toPromise()
            .then(response => response.json() as T)
            .catch(this.handleError);
    }
    private handleError(error: any): Promise<any> {
        console.log('An error occurred', error);
        return Promise.reject(error.message || error);
    }
}

最新更新