日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NetCore中三种注入生命周期的思考

發布時間:2023/12/4 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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中三种注入生命周期的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。