2016-07-24 67 views
6

如果在使用不同類型的組件構造函數中調用Angular注入一個以上的通用服務實例,Angular會注入嗎?以角度注入通用服務

我有很多服務將爲不同的類提供相同的功能,這些類都是從同一個基類繼承而來的。我想用Typescript的通用模式MyService<T extends BaseClass>來解決這個問題。

但我不知道它如何與角的注射器jives:

  1. 請問角注射器比創建一個實例該服務的更多,如果它注入與不同類型的不同組成部分?
  2. 如果使用相同類型調用噴油器,噴油器是否會噴入相同實例

代碼:

@Injectable 
export class MyService<T> { 
    ... 
} 

@Component 
export class ComponentA { 
    constructor(alphaService MyService<Alpha>) {} <--Instance 1 
} 

@Component 
export class ComponentB { 
    constructor(betaService MyService<Beta>) {} <----Instance 2? 
} 

@Component 
export class ComponentA1 { 
    constructor(alphaService MyService<Alpha>) {} <---Instance 1? 
} 

這是合法的嗎?注入器是否知道創建兩個MyService實例?

回答

2

將不會爲泛型創建額外的實例。由於它是表示herereflect-metadata(其用於通過角2個裝飾器來支持打字原稿類型的註釋)不能獲得這種信息:

打字稿僅發出用於在運行時可用類型類型的元數據,並執行不會發出類型別名,接口或泛型(因爲它們沒有JavaScript表示)。

MyService實例的數量取決於MyService是定義爲組件的提供者還是繼承自父注入器。

在上面的代碼,ComponentAComponentA1可以繼承父注射器MyService提供商,ComponentB可以得到providers: [MyService]一個新的實例。

9

這是一個簡單的解決方案:

// service and models 
export class User{ 
    firstName:string 
} 
export class Admin{ 
    lastName:string 
} 

@Injectable() 
export class GenericService<T>{ 
    item:number = Math.random(); 
    GetAll():Array<T> { 
     let output = []; 
     console.log(this.item); // each instance has own value 
     return output; 
    } 
} 

然後通過useFactory設置你的服務模塊:

providers: [ 
     {provide:'UserService', useFactory:()=>(new GenericService<User>())}, 
     {provide:'AdminService', useFactory:()=>(new GenericService<Admin>())}, 
    ], 

,並用@Inject裝飾注入你的服務:

constructor(@Inject('UserService') private userService:GenericService<User>, 
       @Inject('AdminService') private adminService:GenericService<Admin> 
    ) { } 

保持記住,最好使用InjectionTokenOpaqueToken已棄用)爲您的p rovider token.I爲了簡單起見,我使用了字符串。

+3

請注意:不推薦使用'OpaqueToken'。改爲使用[**'InjectionToken' **](https://angular.io/docs/ts/latest/api/core/index/InjectionToken-class.html)。 – developer033

+0

那麼,如何爲構造函數注入'HttpClient'(或'HttpModule')對象,就像這個構造函數(private http:HttpClient) – Bellash