該篇內容由我的博客點擊跳轉同步更新!轉載請註明出處!微信
.NetCore完全詮釋了「萬物皆可注入」這句話的含義,在.NetCore中處處可見注入的使用。所以core中也提供了三種注入方式的使用,分別是:函數
- AddTransient:每次請求,都獲取一個新的實例。即便同一個請求獲取屢次也會是不一樣的實例
- AddScoped:每次請求,都獲取一個新的實例。同一個請求獲取屢次會獲得相同的實例
- AddSingleton:每次都獲取同一個實例
當你們已通過了百度每種注入方式的使用場景後,有沒有萌生出一個新的問題:就是一個做用域(Scoped)服務中注入一個瞬時(Transient)服務時,瞬時服務中的值還會每次都變化嗎?。
出現這個問題是由於:我有兩個服務,一個是數據處理服務A(Scoped),一個是從Redis取數據的服務B(Transient),原本想的是處理數據時每次從Redis中新開實例來取數據,可是事與願違每次Redis實例老是不變,而後本身下載了官方的示例程序研究了一下,在此作個記錄,如下爲了好區分,我就以主次服務來區分,一共分爲幾下幾種狀況:對象
由圖可知,在這種狀況下瞬時服務是沒用的,兩次的結果是同樣的。緣由是由於scoped服務只有第一次運行的時候是走構造函數的,後面再建立都是直接賦值,而不是建立新對象不走構造函數所以值也不會改變。blog
這種狀況直接報錯(Cannot Consume Scoped Service From Singleton),這是由於Core防止咱們陷入這樣的一個陷阱,怕咱們誤覺得每次請求都會建立一個新的實例作用域
發現結果也是同樣的,並且並無向上面同樣報錯,難道微軟粑粑就不怕咱們陷入這樣的一個陷阱嗎?我我的以爲緣由是這樣的:Scoped方式是每一個請求時建立一個新的實例,但Transient是每一個請求中調用每一個服務都會建立一個新的實例,在一次請求中,若是在Singleton中還使用Scoped的話,Scoped和Singleton的意義是同樣的(好比我此次請求的時候正常Scoped產生的值是1,我在其它服務中使用的值都將是1,可是在Singleton中保存的值仍是0,這樣就會產生歧義),但若是Singleton中使用Transient的話只針對當前服務中是惟一的,調用其它服務的時候Transient仍是會建立新的實例,所以在其它服務中就不會有其它問題(簡單來說就是默認我在Singleton中調用Transient時我就默認產生的值就爲0,反正我每次請求都會產生新的值,無所謂是0仍是1,仍是2了),雖然沒有報錯但咱們仍是要避免這樣使用。get
微信關注我哦!(轉載註明出處)