我已經在TypeScript中創建了一個組件庫,我想分享許多服務。如何將公共依賴注入到其他Angular2 @Injectable類中?
export abstract class ComponentBase<T> {
constructor(protected http:Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) {
}
}
問題是我有多個嵌套類型,所以每當我必須從層次結構中派生任何級別。每個派生類型看起來都像這樣傳遞了基礎的注入參數。
import { Http } from '@angular/http';
import { Router, ActivatedRoute, Params } from '@angular/router';
export class SomeDerivedType extends ComponentBase<SomeType> {
constructor(protected http: Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) {
super(http, router, route, params);
}
}
我必須鏈我的構造函數來滿足基類的構造函數參數。這是非常煩人的開銷。因此,我創建了一個Services
類來保存所有封裝的依賴項。
import { Injectable } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { Http } from "@angular/http";
@Injectable()
export class Services {
constructor(public http:Http, public router: Router, public route: ActivatedRoute, public params: Params) {
}
}
我認爲我應該能夠將這個服務類注入組件如下。
import { Services } from './services'
export class SomeDerivedType extends ComponentBase<any> {
constructor(protected services: Services) {
super(services);
}
}
而且現在的分量基礎如下所示:
import { Services } from './services';
import { Http } from '@angular/http';
import { Router, ActivatedRoute, Params } from '@angular/router';
export abstract class ComponentBase<T> {
http: Http;
router: Router;
route: ActivatedRoute;
params: Params;
constructor(protected services: Services) {
this.http = services.http;
this.route = services.route;
this.router = services.router;
this.params = services.params;
}
}
這不幸地不是爲我工作,而不是我得到以下錯誤:
(index):63 Error: Error: Can't resolve all parameters for Services: ([object Object], [object Object], [object Object], ?).
因此,很自然我問題是,「是否有辦法將依賴服務(即http,路由器,路由和參數服務)注入到我的服務類中?」
如果組件庫和任何派生類需要注入依賴關係,那麼它們需要使用注入式裝飾器(或指令或組件)進行修飾,但是不應該這樣構造應用程序。用您創建的所有隱藏的依賴關係來維護幾乎是不可能的。 – bryan60
我不知道我要維護什麼,你可以詳細說明一下嗎?此外,我不注入除服務類以外的任何東西,所以爲什麼我需要用@injectable裝飾組件類? – jwize
這樣做的任何優勢? – Aravind