欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#服務(wù)生命周期:Singleton、Scoped、Transient用法及說明

 更新時間:2025年01月20日 14:18:05   作者:bestcxx  
文章介紹了三種服務(wù)生命周期:單例、作用域和瞬態(tài),并討論了如何在ASP.NETCore中使用這些生命周期管理服務(wù),單例在應(yīng)用程序生命周期中只有一個實(shí)例,作用域在每個請求中創(chuàng)建一個新實(shí)例,瞬態(tài)每次請求時創(chuàng)建一個新實(shí)例

概念:服務(wù)生命周期

單例 (Singleton) 

整個應(yīng)用程序生命周期中只有一個實(shí)例被創(chuàng)建并共享。

如果你在依賴注入容器中將 AsyncPeriodicBackgroundWorkerBase 的實(shí)現(xiàn)注冊為單例,那么這個任務(wù)將會是單例的。

作用域 (Scoped) 

每個請求一個新實(shí)例,通常在 Web 應(yīng)用中使用。

如果你將它注冊為作用域服務(wù),每個作用域(例如 HTTP 請求)中會創(chuàng)建一個新的實(shí)例。

瞬態(tài) (Transient) :

每次請求時都會創(chuàng)建一個新的實(shí)例。

如果注冊為瞬態(tài)服務(wù),每次獲取該服務(wù)時都會得到一個新的實(shí)例。

如何確定任務(wù)是否為單例

假設(shè)你是在使用 ASP.NET Core 或類似的依賴注入框架,你可以通過如下方式注冊到服務(wù)中來決定生命周期:

public void ConfigureServices(IServiceCollection services)
{
    // 將該任務(wù)注冊為單例
    services.AddSingleton<MyBackgroundWorker>();
    
    // 或者作為一個作用域?qū)嵗?
    // services.AddScoped<MyBackgroundWorker>();

    // 或者作為一個瞬態(tài)實(shí)例
    // services.AddTransient<MyBackgroundWorker>();
}

對 Scoped 和 Transient 進(jìn)一步辨析

在后端服務(wù)中(例如使用 ASP.NET Core 的應(yīng)用程序),Scoped 和 Transient 是兩種常用的服務(wù)生命周期管理方式,它們定義了服務(wù)實(shí)例的創(chuàng)建和使用方式。

了解它們之間的區(qū)別對于選擇合適的服務(wù)生命周期管理有重要意義:

Scoped 生命周期

Scoped 服務(wù)在每個請求(或作用域,一個會話內(nèi))中被創(chuàng)建一次。一個請求期間同一服務(wù)的所有請求將獲得相同的實(shí)例。

使用場景 :

  • 通常用于 Web 應(yīng)用程序中,作用域服務(wù)在每個 HTTP 請求的開始時創(chuàng)建,并在請求結(jié)束時釋放。這種方式適合那些需要在同一請求上下文共享數(shù)據(jù)的情況下使用。
  • 例如,通常數(shù)據(jù)庫上下文(DbContext)就會被注冊為 Scoped 以保證一個請求使用同一個數(shù)據(jù)庫連接。

適用性 :

  • 不適用于非 Web 場景或者后臺服務(wù)中沒有請求界限的情況下使用。

Transient 生命周期

Transient 服務(wù)在每次請求它們的時候都會創(chuàng)建一個新的實(shí)例。即,每次獲取服務(wù)都會得到一個新的實(shí)例。

使用場景 :

  • 適用于輕量級無狀態(tài)的服務(wù),比如:工具類、轉(zhuǎn)換器等,每次使用都需要新的實(shí)例,而不需要在不同請求或調(diào)用之間保持狀態(tài)。
  • 優(yōu)化系統(tǒng)內(nèi)存開銷,保證服務(wù)獨(dú)占其狀態(tài)。

適用性:

  • 適用于多種類型的應(yīng)用場景,不受限于請求或作用域的邊界。
  • 因?yàn)樗敲看握埱髣?chuàng)建新實(shí)例,所以使用時需要注意控制實(shí)例構(gòu)造成本,以減少性能消耗。

選擇哪種生命周期

  • Scoped:使用 Scoped 主要是針對應(yīng)用的請求/會話生命周期,適合單請求內(nèi)的數(shù)據(jù)一致性場景。
  • Transient:使用 Transient 主要是為了實(shí)現(xiàn)無狀態(tài)的輕量級服務(wù),每次都可創(chuàng)建獨(dú)立實(shí)例的使用場景。

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論