asp.net core ServiceProvider
針對每次請求所使用的ServiceProvider依然是WebHost的ServiceProvider嗎?
對于某個由ServiceProvider提供的服務對象說,針對它的回收也是由這個ServiceProvider來完成的。
具體來說,非根(root)ServiceProvider在自身被回收的時候,由它提供的采用Scoped和Transient模式的服務實例會自動被回收;至于采用Singleton模式的服務實例,針對它們的回收發生在根(root)ServiceProvider自身被回收的時候
如果不是 ,那么兩者是什么關系?
如果我們在這個ServiceProvider上以Transient模式注冊了一個服務,這意味著每次從ServiceProvider提取的都是一個全新的對象。如果這些對象引用著一些需要被回收的資源,我們希望資源的回收應該在每次請求處理結束之后自動執行。
如果管道每次處理請求時所使用的都是同一個ServiceProvider對象,那么針對服務實例的回收只能在整個應用終止的時候才會發生(因為服務始終被這一個ServiceProvider所引用),這無疑會產生內存泄漏的問題。基于這個原因。
管道總是會創建一個新的ServiceProvider來提供處理每個請求所需的服務,并且這個ServiceProvider將在每次請求處理完成之后被自動回收掉。
這樣一個ServiceProvider被創建之后直接保存到當前的HTTP上下文中,我們可以利用HttpContext的RequestServices屬性得到這個ServiceProvider
總結就是:
單例模式下,服務被根(root)ServiceProvider構建出來,并且由它回收
Scoped和Transient模式下則是由每個單獨的http請求中創建的新ServiceProvider構建與回收
如果當前無法使用ASP.NET 需要開發一套新的框架,不論是傳輸協議是什么、不論解編碼協議是什么,在IOC這一塊都可以沿用ASP.NET CORE的處理邏輯,且開發成本很低,只需要在幾個關鍵點引入ServiceProvider

浙公網安備 33010602011771號