今天我偶然發現了一些我認爲不會引起麻煩的事情。在Java和Spring中,我可以聲明兩個實現給定接口的bean,而在另一個注入它們的類中,我只能使用接口;這實際上就是我喜歡IoC的原因:你並不需要知道你正在使用什麼對象,只有它是kind。角2可注射接口?
所以在我的小Angular2 /打字稿程序,我試圖做同樣的:
webapp.module.ts:
...
import { WebAppConfigurationService } from './app/services/webapp.configuration.service';
@NgModule({
...
providers: [WebAppConfigurationService]
})
export class AppModule { }
tnsapp.module.ts:
...
import { TnsConfigurationService } from './services/tns.configuration.service';
@NgModule({
...
providers: [TnsConfigurationService]
})
export class AppModule { }
這兩個模塊都使用不同的提供者:TnsConfigurationService
或WebAppConfigurationService
。
然而,這兩個@Injectable
服務實現相同的接口:
configuration.interface:
export interface IConfigurationService {
...
}
最後,在我的組成部分之一,我用這些模塊我發現一個提供注射你在開始:
import { IConfigurationService } from './configuration.interface';
export class HeroesService {
constructor(private configurationService: IConfigurationService) { }
}
我的期望是這最後一個組件注入了正確的服務,即使在第儀表只是明確界定界面。當然,我得到一個錯誤(「錯誤:無法解析所有參數給英雄服務」)
現在,我不期待一個簡單的解決方案,因爲它聽起來像一個架構缺乏。但也許有人可以指出我的另一種設計?
查看DI文檔https://angular.io/docs/ts/latest/guide/dependency-injection.html#typescript-interfaces-aren-t-valid-tokens – yurzui
@yurzui我喜歡它:「這不是Angular的錯。「 :-)好吧,也許還有一個美麗的方式來做到這一點...我稍後會閱讀這個'OpaqueToken' – Sebas
OpaqueToken主要用於非類提供者(工廠和值)。 – estus