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