網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1.前言
在ConfigureServices方法中的容器注冊(cè)每個(gè)應(yīng)用程序的服務(wù),Asp.Core都可以為每個(gè)應(yīng)用程序提供三種服務(wù)生命周期:
- Transient(暫時(shí)):每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的實(shí)例。這種生命周期最適合輕量級(jí),無(wú)狀態(tài)服務(wù)。
- Scoped(作用域):在同一個(gè)作用域內(nèi)只初始化一個(gè)實(shí)例 ,可以理解為每一個(gè)請(qǐng)求只創(chuàng)建一個(gè)實(shí)例,同一個(gè)請(qǐng)求會(huì)在一個(gè)作用域內(nèi)。
- Singleton(單例):整個(gè)應(yīng)用程序生命周期以內(nèi)只創(chuàng)建一個(gè)實(shí)例,后續(xù)每個(gè)請(qǐng)求都使用相同的實(shí)例。如果應(yīng)用程序需要單例行為,建議讓服務(wù)容器管理服務(wù)的生命周期,而不是在自己的類中實(shí)現(xiàn)單例模式。
2.服務(wù)生命周期與注冊(cè)選項(xiàng)案例演示
為了演示生命周期和注冊(cè)選項(xiàng)之間的差異,請(qǐng)考慮以下接口,將任務(wù)表示為具有唯一標(biāo)識(shí)符 OperationId 的操作。根據(jù)以下接口配置操作服務(wù)的生命周期的方式,容器在類請(qǐng)求時(shí)提供相同或不同的服務(wù)實(shí)例:
public interface IOperation { Guid OperationId { get; } } public interface IOperationTransient : IOperation { } public interface IOperationScoped : IOperation { } public interface IOperationSingleton : IOperation { } public interface IOperationSingletonInstance : IOperation { }
上面四種服務(wù)接口在 Operation 類中實(shí)現(xiàn)。調(diào)用Operation類時(shí)將自動(dòng)生成一個(gè)GUID,下面是Operation類的實(shí)現(xiàn):
public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance { public Operation() : this(Guid.NewGuid()) { } public Operation(Guid id) { OperationId = id; } public Guid OperationId { get; private set; } }
再注冊(cè)一個(gè)OperationService服務(wù)實(shí)例,當(dāng)通過(guò)依賴關(guān)系注入請(qǐng)求 OperationService 實(shí)例時(shí),它將接收每個(gè)服務(wù)的新實(shí)例或基于從屬服務(wù)(Operation)的生命周期的現(xiàn)有實(shí)例。OperationService 服務(wù)作用就是第二次調(diào)用 Operation類,查看Operation類實(shí)例的作用域變化。
public class OperationService { public OperationService( IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance instanceOperation) { _transientOperation = transientOperation; _scopedOperation = scopedOperation; _singletonOperation = singletonOperation; _singletonInstanceOperation = instanceOperation; } public IOperationTransient _transientOperation { get; } public IOperationScoped _scopedOperation { get; } public IOperationSingleton _singletonOperation { get; } public IOperationSingletonInstance _singletonInstanceOperation { get; } }
然后在Startup.ConfigureServices()服務(wù)容器中注冊(cè)各個(gè)生命周期的實(shí)例:
public void ConfigureServices(IServiceCollection services) { services.AddTransient(); services.AddScoped (); services.AddSingleton (); services.AddSingleton (new Operation(Guid.Empty)); // OperationService depends on each of the other Operation types. services.AddTransient (); }
再在IndexModel模塊里面調(diào)用OnGet方法輸出,觀察IOperation與OperationService類屬性O(shè)perationId 值的變化:
public class IndexModel : PageModel { public OperationService _operationService { get; } public IOperationTransient _transientOperation { get; } public IOperationScoped _scopedOperation { get; } public IOperationSingleton _singletonOperation { get; } public IOperationSingletonInstance _singletonInstanceOperation { get; } public IndexModel( OperationService operationService, IOperationTransient transientOperation, IOperationScoped scopedOperation, IOperationSingleton singletonOperation, IOperationSingletonInstance singletonInstanceOperation) { _operationService = operationService; _transientOperation = transientOperation; _scopedOperation = scopedOperation; _singletonOperation = singletonOperation; _singletonInstanceOperation = singletonInstanceOperation; } public void OnGet() { Console.WriteLine("IOperation操作:"); Console.WriteLine("暫時(shí):" + _transientOperation.OperationId.ToString()); Console.WriteLine("作用域:" + _scopedOperation.OperationId.ToString()); Console.WriteLine("單例:" + _singletonOperation.OperationId.ToString()); Console.WriteLine("實(shí)例:" + _singletonInstanceOperation.OperationId.ToString()); Console.WriteLine("OperationService操作:"); Console.WriteLine("暫時(shí):" + _operationService._transientOperation.OperationId.ToString()); Console.WriteLine("作用域:" + _operationService._scopedOperation.OperationId.ToString()); Console.WriteLine("單例:" + _operationService._singletonOperation.OperationId.ToString()); Console.WriteLine("實(shí)例:" + _operationService._singletonInstanceOperation.OperationId.ToString()); } }
執(zhí)行IndexModel 類輸出結(jié)果:
由圖總結(jié)如下:
2.1 Transient(暫時(shí)):每次調(diào)用服務(wù)的時(shí)候都會(huì)創(chuàng)建一個(gè)新的實(shí)例。即在IndexModel類的局部方法或?qū)傩灾校ㄟ@里是OnGet方法)實(shí)例化一個(gè)依賴對(duì)象Operation類,偽代碼是:
public class IndexModel: PageModel { public void OnGet() { //調(diào)用IndexModel類時(shí),實(shí)例化了兩次Operation類 //第一次 OperationService operationService=new OperationService(); //第二次 IOperationTransient TransientOperation=new Operation(); } }
2.2 Scoped(作用域):一次請(qǐng)求(Action)內(nèi)對(duì)象實(shí)例是相同的,但每次請(qǐng)求會(huì)產(chǎn)生一個(gè)新實(shí)例。相當(dāng)于在IndexModel類的全局中實(shí)例化一次依賴對(duì)象Operation類,偽代碼是:
OperationService operationService = null; public IndexModel() { operationService = new OperationService(); operationService._scopedOperation = new Operation(); } public void OnGet() { operationService._scopedOperation.OperationId; IOperationScoped operationScoped = operationService._scopedOperation; operationScoped.OperationId }
2.3 Singleton(單例):首次請(qǐng)求初始化同一個(gè)實(shí)例,后續(xù)每次請(qǐng)求都使用同一個(gè)實(shí)例。相當(dāng)于在整個(gè)應(yīng)用Application中只實(shí)例化一次實(shí)例,常見的單例模式。
?生命周期流程圖如下:
原文鏈接:https://www.cnblogs.com/wzk153/p/10897826.html
相關(guān)推薦
- 2022-06-07 Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作詳解_python
- 2023-01-11 pytorch使用-tensor的基本操作解讀_python
- 2023-12-17 SpringSecurity 用戶帳號(hào)已被鎖定
- 2022-04-25 python遞歸&迭代方法實(shí)現(xiàn)鏈表反轉(zhuǎn)_python
- 2022-05-26 ASP.NET?Core依賴注入詳解_實(shí)用技巧
- 2022-11-12 一文搞懂Go語(yǔ)言中defer關(guān)鍵字的使用_Golang
- 2022-09-29 Shell函數(shù)返回值方式_linux shell
- 2022-06-29 C++詳細(xì)講解IO流原理_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支