.NetCore中三種注入方式的思考


該篇內容由個人博客點擊跳轉同步更新!轉載請注明出處!

.NetCore徹底詮釋了“萬物皆可注入”這句話的含義,在.NetCore中到處可見注入的使用。因此core中也提供了三種注入方式的使用,分別是:

  1. AddTransient:每次請求,都獲取一個新的實例。即使同一個請求獲取多次也會是不同的實例
  1. AddScoped:每次請求,都獲取一個新的實例。同一個請求獲取多次會得到相同的實例
  1. 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了),雖然沒有報錯但我們還是要避免這樣使用。

微信關注我哦!(轉載注明出處)關注我哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM