2017-02-16 82 views
3

我有兩個服務,都是@Injectable。 ServiceA通過Providers陣列提供給組件,並且在任何地方都可以很好地工作。 ServiceB是一個單身人士,位於模塊的Providers數組中,並且在任何地方都可以工作。 ServiceA需要保持不是單身,ServiceB需要保持單身。麻煩注入服務到另一個服務(單例),Angular2

我的問題是,現在我需要從ServiceB訪問ServiceA,但不知道如何訪問它。似乎我不能注入一個非單身服務到單身。

我遇到的一切都告訴我把服務放在bootstrap或模塊聲明中,但正如我所提到的,我無法做到這一點,因爲我需要ServiceA來表現爲非單例。

// module setup 
... providers: [ServiceB] 

// non-singleton 
@Injectable() 
export class ServiceA 

// singleton 
@Injectable() 
export class ServiceB { 
    constructor(ServiceA) // <-- this is the problem area, need to get ServiceA here 

我試圖做這樣的構造(進樣(ServiceA)serviceA),但似乎與得到相同的錯誤,

Error: DI Error No provider for ServiceA!

  1. 我怎麼能「提供」非單服務變成一個單身服務,其中兩個都是@Injectable?

回答

4

可以聲明ServiceA無論是在@Component.providers@NgModule.providers

  • 當注入的組件的構造ServiceA,你會得到部分範圍的情況下(對應於@Component.providers聲明)。
  • 當在另一個服務的構造函數中注入ServiceA(在您的情況下:在ServiceB中注入ServiceA時),您將獲得全局實例(對應於@NgModule.providers聲明)。

換句話說,如果你在一個組件的供應商(@Component.providers)重新聲明一個服務,它會「影子」的實例是在全球範圍內@NgModule.providers聲明。

小心字:

  • 如果注入ServiceAServiceBServiceC,然後B和C會得到A的同一個實例
  • 正如意見中提到的Seaal,組織代碼這種方式可能不符合最佳實踐。
+0

非常感謝@AngularFrance,這是現在的技巧。我注意到你的謹慎和相同的想法,但是一定有辦法解決這個問題,儘管不是嗎?我認爲這可能會導致問題在道路上......理論上你應該能夠注入非單身單身而不會造成任何問題,但是Angular2並不提供一個好方法。 –

+0

不客氣。解決指定限制的另一種方法可能是重構代碼。我想你需要你的服務是一個非單身人士,因爲每個服務實例必須有不同的狀態/數據。也許你可以讓服務成爲一個單身人士,而手動*維護註冊表中的多個國家的服務。大聲思考,不確定這是否適用於你的情況。 – AngularChef

+0

將非單例注入單例是一種代碼異味。你可以使用[Angular2 Injector](https://angular.io/docs/ts/latest/api/core/index/Injector-class。HTML)直接(理想情況下在工廠類中),如果你想創建'ServiceA'到多個其他服務的不同實例。 – Seaal