2016-04-25 96 views
3

當使用分級注射時,非根注射器中提供的依賴的壽命是多少?分級注射器和依賴壽命

語境:

我的角2個應用程序由多個部分組成。根組件中有一個@RouteConfig,其中包含組件ABC的路由。組件B有小孩@RouteConfig到第xy

/A 
/B 
    /x 
    /y 
/C 

組件x需求的服務q。如圖J. Papa's Angular 2 style guide建議,我在組件x一級提供的服務給噴射器,即

@xComponent({ 
    providers: [q] 
}) 
export class xComponent { ... } 

服務q請求和內部緩存一些數據。我的印象是服務是單身人士,隨後訪問/B/x時,數據將從緩存中提供。但是,通過上述設置,每次用戶打開/B/x時,都會再次請求數據。我在服務q的構造函數中輸入console.log("creating q"),並看到只要訪問了/B/x,就會創建一個新的服務實例。

如果我提供在部件/B的水平的服務,/B/x/B/y之間導航時的值被緩存,但導航到任何/A/C時丟失。

無論何時組件被破壞,噴射器似乎都被銷燬。這是預期的行爲?

什麼是正確的方式來配置應用程序,使該服務不會被重新創建?很明顯,我可以在根組件級別提供服務,但也許我錯過了一些東西?

回答

1

你完全理解注射器的行爲。它們被添加到那裏的組件並被銷燬。

所以在你的情況下,你真的需要添加服務作爲一個全球性的。這將使它成爲一個「單身人士」。


附加鏈接

如果您想了解更多關於angular2依賴注入,我可以推薦這篇文章:http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

+0

謝謝,「與組件一起銷燬」的部分就是我所缺少的。我想知道 - 這是否記錄在任何地方?它似乎沒有在thetram.io文章中提及,也沒有在Angular 2文檔中提及。 –

+0

@RonaldZarīts我不這麼認爲,但這是邏輯的方式,因爲否則,你會得到大量注入器在一個巨大的應用程序中。 – Dinistro

2

Angular2的團隊成員多次強調DI維護的實例是而不是單身(他們認爲單身人士是不太好的設計模式)。

相反,Angular2 DI爲每個提供者維護一個實例。

Angular還會創建一個類似於組件樹的注入器樹。

當一個組件創建了這個組件創建(也毀壞了,當組件被銷燬)一個新的子注入

孩子注射器都有自己的一套供應商從組件providers:列表。

如果子注入器找不到所請求密鑰(令牌或類型)的提供者,它將請求轉發給父注入器。

結論

如果你想確保只有一個服務的單個實例在應用程序中創建的,與你的根組件的providers: [...]列表中註冊(建議​​),或者用bootstrap(...)

+2

從[角2個分層DI文檔(https://開頭angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html)。 「在特定的注入器中只能有一個服務類型的實例,但我們已經瞭解到,我們可以在應用程序的組件樹的不同層次上運行多個注入器,任何注入器都可以擁有自己的服務實例。 「這很好。我(錯誤地)認爲注射器會以某種方式堅持。您的評論「..與組件一起銷燬」)至關重要。謝謝! –