C#服務(wù)生命周期:Singleton、Scoped、Transient用法及說明
概念:服務(wù)生命周期
單例 (Singleton)
整個(gè)應(yīng)用程序生命周期中只有一個(gè)實(shí)例被創(chuàng)建并共享。
如果你在依賴注入容器中將 AsyncPeriodicBackgroundWorkerBase 的實(shí)現(xiàn)注冊(cè)為單例,那么這個(gè)任務(wù)將會(huì)是單例的。
作用域 (Scoped)
每個(gè)請(qǐng)求一個(gè)新實(shí)例,通常在 Web 應(yīng)用中使用。
如果你將它注冊(cè)為作用域服務(wù),每個(gè)作用域(例如 HTTP 請(qǐng)求)中會(huì)創(chuàng)建一個(gè)新的實(shí)例。
瞬態(tài) (Transient) :
每次請(qǐng)求時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例。
如果注冊(cè)為瞬態(tài)服務(wù),每次獲取該服務(wù)時(shí)都會(huì)得到一個(gè)新的實(shí)例。
如何確定任務(wù)是否為單例
假設(shè)你是在使用 ASP.NET Core 或類似的依賴注入框架,你可以通過如下方式注冊(cè)到服務(wù)中來決定生命周期:
public void ConfigureServices(IServiceCollection services)
{
// 將該任務(wù)注冊(cè)為單例
services.AddSingleton<MyBackgroundWorker>();
// 或者作為一個(gè)作用域?qū)嵗?
// services.AddScoped<MyBackgroundWorker>();
// 或者作為一個(gè)瞬態(tài)實(shí)例
// services.AddTransient<MyBackgroundWorker>();
}對(duì) Scoped 和 Transient 進(jìn)一步辨析
在后端服務(wù)中(例如使用 ASP.NET Core 的應(yīng)用程序),Scoped 和 Transient 是兩種常用的服務(wù)生命周期管理方式,它們定義了服務(wù)實(shí)例的創(chuàng)建和使用方式。
了解它們之間的區(qū)別對(duì)于選擇合適的服務(wù)生命周期管理有重要意義:
Scoped 生命周期
Scoped 服務(wù)在每個(gè)請(qǐng)求(或作用域,一個(gè)會(huì)話內(nèi))中被創(chuàng)建一次。一個(gè)請(qǐng)求期間同一服務(wù)的所有請(qǐng)求將獲得相同的實(shí)例。
使用場(chǎng)景 :
- 通常用于 Web 應(yīng)用程序中,作用域服務(wù)在每個(gè) HTTP 請(qǐng)求的開始時(shí)創(chuàng)建,并在請(qǐng)求結(jié)束時(shí)釋放。這種方式適合那些需要在同一請(qǐng)求上下文共享數(shù)據(jù)的情況下使用。
- 例如,通常數(shù)據(jù)庫(kù)上下文(DbContext)就會(huì)被注冊(cè)為 Scoped 以保證一個(gè)請(qǐng)求使用同一個(gè)數(shù)據(jù)庫(kù)連接。
適用性 :
- 不適用于非 Web 場(chǎng)景或者后臺(tái)服務(wù)中沒有請(qǐng)求界限的情況下使用。
Transient 生命周期
Transient 服務(wù)在每次請(qǐng)求它們的時(shí)候都會(huì)創(chuàng)建一個(gè)新的實(shí)例。即,每次獲取服務(wù)都會(huì)得到一個(gè)新的實(shí)例。
使用場(chǎng)景 :
- 適用于輕量級(jí)無狀態(tài)的服務(wù),比如:工具類、轉(zhuǎn)換器等,每次使用都需要新的實(shí)例,而不需要在不同請(qǐng)求或調(diào)用之間保持狀態(tài)。
- 優(yōu)化系統(tǒng)內(nèi)存開銷,保證服務(wù)獨(dú)占其狀態(tài)。
適用性:
- 適用于多種類型的應(yīng)用場(chǎng)景,不受限于請(qǐng)求或作用域的邊界。
- 因?yàn)樗敲看握?qǐng)求創(chuàng)建新實(shí)例,所以使用時(shí)需要注意控制實(shí)例構(gòu)造成本,以減少性能消耗。
選擇哪種生命周期
Scoped:使用 Scoped 主要是針對(duì)應(yīng)用的請(qǐng)求/會(huì)話生命周期,適合單請(qǐng)求內(nèi)的數(shù)據(jù)一致性場(chǎng)景。Transient:使用 Transient 主要是為了實(shí)現(xiàn)無狀態(tài)的輕量級(jí)服務(wù),每次都可創(chuàng)建獨(dú)立實(shí)例的使用場(chǎng)景。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unity3D實(shí)現(xiàn)扭動(dòng)擠壓瀏覽效果
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)扭動(dòng)擠壓瀏覽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中
這篇文章介紹了C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#實(shí)現(xiàn)WebAPI接口安全加密的具體方案
在項(xiàng)目開發(fā)過程中,接口的安全性往往是一個(gè)容易被忽視但極其關(guān)鍵的環(huán)節(jié),本文介紹了一套實(shí)際項(xiàng)目中已落地的?Web?API?安全加密方案,涵蓋了?SHA256?加簽、RSA?非對(duì)稱加密、AES?對(duì)稱加密?以及相關(guān)數(shù)據(jù)格式轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下2025-06-06
C#控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單飛行棋游戲
這篇文章主要為大家詳細(xì)介紹了C#控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單飛行棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
在C#語言里對(duì)NULL的技術(shù)處理小結(jié)
在 C# 中處理 null 值是編寫可靠且可靠的代碼的一個(gè)重要方面,在本文中,我將討論一些在 C# 中處理 null 值的最常用技術(shù),感興趣的朋友跟隨小編一起看看吧2024-05-05

