.NetCore中三种注入生命周期的思考
.NetCore徹底詮釋了“萬物皆可注入”這句話的含義,在.NetCore中到處可見注入的使用。因此core中也提供了三種注入方式的生命周期使用,分別是:
AddTransient:每次請求,都獲取一個新的實例。即使同一個請求獲取多次也會是不同的實例
AddScoped:每次請求,都獲取一個新的實例。同一個請求獲取多次會得到相同的實例
AddSingleton:每次都獲取同一個實例
當大家已經過了百度每種注入方式的使用場景后,有沒有萌生出一個新的問題:就是一個作用域(Scoped)服務中注入一個瞬時(Transient)服務時,瞬時服務中的值還會每次都變化嗎?。
出現這個問題是因為:我有兩個服務,一個是數據處理服務A(Scoped),一個是從Redis取數據的服務B(Transient),本來想的是處理數據時每次從Redis中新開實例來取數據,但是事與愿違每次Redis實例總是不變,然后自己下載了官方的示例程序研究了一下,在此做個記錄,以下為了好區分,我就以主次服務來區分,一共分為幾下幾種情況:
由圖可知,在這種情況下瞬時服務是沒用的,兩次的結果是一樣的。原因是因為scoped服務只有第一次運行的時候是走構造函數的,后面再創建都是直接賦值,而不是創建新對象不走構造函數因此值也不會改變。
這種情況直接報錯(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了),雖然沒有報錯但我們還是要避免這樣使用。
原文地址:https://www.cnblogs.com/ShaoJianan/p/11136200.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的.NetCore中三种注入生命周期的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core IdentitySe
- 下一篇: 从零开始实现ASP.NET Core M