C#服務(wù)生命周期:Singleton、Scoped、Transient用法及說明
概念:服務(wù)生命周期
單例 (Singleton)
整個應(yīng)用程序生命周期中只有一個實例被創(chuàng)建并共享。
如果你在依賴注入容器中將 AsyncPeriodicBackgroundWorkerBase 的實現(xiàn)注冊為單例,那么這個任務(wù)將會是單例的。
作用域 (Scoped)
每個請求一個新實例,通常在 Web 應(yīng)用中使用。
如果你將它注冊為作用域服務(wù),每個作用域(例如 HTTP 請求)中會創(chuàng)建一個新的實例。
瞬態(tài) (Transient) :
每次請求時都會創(chuàng)建一個新的實例。
如果注冊為瞬態(tài)服務(wù),每次獲取該服務(wù)時都會得到一個新的實例。
如何確定任務(wù)是否為單例
假設(shè)你是在使用 ASP.NET Core 或類似的依賴注入框架,你可以通過如下方式注冊到服務(wù)中來決定生命周期:
public void ConfigureServices(IServiceCollection services) { // 將該任務(wù)注冊為單例 services.AddSingleton<MyBackgroundWorker>(); // 或者作為一個作用域?qū)嵗? // services.AddScoped<MyBackgroundWorker>(); // 或者作為一個瞬態(tài)實例 // services.AddTransient<MyBackgroundWorker>(); }
對 Scoped 和 Transient 進(jìn)一步辨析
在后端服務(wù)中(例如使用 ASP.NET Core 的應(yīng)用程序),Scoped 和 Transient 是兩種常用的服務(wù)生命周期管理方式,它們定義了服務(wù)實例的創(chuàng)建和使用方式。
了解它們之間的區(qū)別對于選擇合適的服務(wù)生命周期管理有重要意義:
Scoped 生命周期
Scoped 服務(wù)在每個請求(或作用域,一個會話內(nèi))中被創(chuàng)建一次。一個請求期間同一服務(wù)的所有請求將獲得相同的實例。
使用場景 :
- 通常用于 Web 應(yīng)用程序中,作用域服務(wù)在每個 HTTP 請求的開始時創(chuàng)建,并在請求結(jié)束時釋放。這種方式適合那些需要在同一請求上下文共享數(shù)據(jù)的情況下使用。
- 例如,通常數(shù)據(jù)庫上下文(DbContext)就會被注冊為 Scoped 以保證一個請求使用同一個數(shù)據(jù)庫連接。
適用性 :
- 不適用于非 Web 場景或者后臺服務(wù)中沒有請求界限的情況下使用。
Transient 生命周期
Transient 服務(wù)在每次請求它們的時候都會創(chuàng)建一個新的實例。即,每次獲取服務(wù)都會得到一個新的實例。
使用場景 :
- 適用于輕量級無狀態(tài)的服務(wù),比如:工具類、轉(zhuǎn)換器等,每次使用都需要新的實例,而不需要在不同請求或調(diào)用之間保持狀態(tài)。
- 優(yōu)化系統(tǒng)內(nèi)存開銷,保證服務(wù)獨占其狀態(tài)。
適用性:
- 適用于多種類型的應(yīng)用場景,不受限于請求或作用域的邊界。
- 因為它是每次請求創(chuàng)建新實例,所以使用時需要注意控制實例構(gòu)造成本,以減少性能消耗。
選擇哪種生命周期
Scoped
:使用 Scoped 主要是針對應(yīng)用的請求/會話生命周期,適合單請求內(nèi)的數(shù)據(jù)一致性場景。Transient
:使用 Transient 主要是為了實現(xiàn)無狀態(tài)的輕量級服務(wù),每次都可創(chuàng)建獨立實例的使用場景。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#遞歸實現(xiàn)顯示文件夾及所有文件并計算其大小的方法
這篇文章主要介紹了C#遞歸實現(xiàn)顯示文件夾及所有文件并計算其大小的方法,是遍歷算法中比較典型的一種應(yīng)用,有不錯的學(xué)習(xí)借鑒價值,需要的朋友可以參考下2014-08-08Unity UGUI實現(xiàn)滑動翻頁直接跳轉(zhuǎn)頁數(shù)
這篇文章主要為大家詳細(xì)介紹了Unity UGUI實現(xiàn)滑動翻頁,直接跳轉(zhuǎn)頁數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04