網站首頁 編程語言 正文
1.前言
在ConfigureServices方法中的容器注冊每個應用程序的服務,Asp.Core都可以為每個應用程序提供三種服務生命周期:
- Transient(暫時):每次請求都會創建一個新的實例。這種生命周期最適合輕量級,無狀態服務。
- Scoped(作用域):在同一個作用域內只初始化一個實例 ,可以理解為每一個請求只創建一個實例,同一個請求會在一個作用域內。
- Singleton(單例):整個應用程序生命周期以內只創建一個實例,后續每個請求都使用相同的實例。如果應用程序需要單例行為,建議讓服務容器管理服務的生命周期,而不是在自己的類中實現單例模式。
2.服務生命周期與注冊選項案例演示
為了演示生命周期和注冊選項之間的差異,請考慮以下接口,將任務表示為具有唯一標識符 OperationId 的操作。根據以下接口配置操作服務的生命周期的方式,容器在類請求時提供相同或不同的服務實例:
public interface IOperation { Guid OperationId { get; } } public interface IOperationTransient : IOperation { } public interface IOperationScoped : IOperation { } public interface IOperationSingleton : IOperation { } public interface IOperationSingletonInstance : IOperation { }
上面四種服務接口在 Operation 類中實現。調用Operation類時將自動生成一個GUID,下面是Operation類的實現:
public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance { public Operation() : this(Guid.NewGuid()) { } public Operation(Guid id) { OperationId = id; } public Guid OperationId { get; private set; } }
再注冊一個OperationService服務實例,當通過依賴關系注入請求 OperationService 實例時,它將接收每個服務的新實例或基于從屬服務(Operation)的生命周期的現有實例。OperationService 服務作用就是第二次調用 Operation類,查看Operation類實例的作用域變化。
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()服務容器中注冊各個生命周期的實例:
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模塊里面調用OnGet方法輸出,觀察IOperation與OperationService類屬性OperationId 值的變化:
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("暫時:" + _transientOperation.OperationId.ToString()); Console.WriteLine("作用域:" + _scopedOperation.OperationId.ToString()); Console.WriteLine("單例:" + _singletonOperation.OperationId.ToString()); Console.WriteLine("實例:" + _singletonInstanceOperation.OperationId.ToString()); Console.WriteLine("OperationService操作:"); Console.WriteLine("暫時:" + _operationService._transientOperation.OperationId.ToString()); Console.WriteLine("作用域:" + _operationService._scopedOperation.OperationId.ToString()); Console.WriteLine("單例:" + _operationService._singletonOperation.OperationId.ToString()); Console.WriteLine("實例:" + _operationService._singletonInstanceOperation.OperationId.ToString()); } }
執行IndexModel 類輸出結果:
由圖總結如下:
2.1 Transient(暫時):每次調用服務的時候都會創建一個新的實例。即在IndexModel類的局部方法或屬性中(這里是OnGet方法)實例化一個依賴對象Operation類,偽代碼是:
public class IndexModel: PageModel { public void OnGet() { //調用IndexModel類時,實例化了兩次Operation類 //第一次 OperationService operationService=new OperationService(); //第二次 IOperationTransient TransientOperation=new Operation(); } }
2.2 Scoped(作用域):一次請求(Action)內對象實例是相同的,但每次請求會產生一個新實例。相當于在IndexModel類的全局中實例化一次依賴對象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(單例):首次請求初始化同一個實例,后續每次請求都使用同一個實例。相當于在整個應用Application中只實例化一次實例,常見的單例模式。
?生命周期流程圖如下:
原文鏈接:https://www.cnblogs.com/wzk153/p/10897826.html
相關推薦
- 2023-07-08 qt修改默認構建路徑
- 2022-02-16 瀏覽器斷點如何使用(測試工具)
- 2023-03-22 淺談C#中[]的幾種用法_C#教程
- 2021-11-08 Linux常用硬盤管理相關命令介紹_Linux
- 2022-08-16 python+pytest自動化測試函數測試類測試方法的封裝_python
- 2022-07-08 Redis中Redisson布隆過濾器的學習_Redis
- 2022-09-29 Kotlin協程啟動createCoroutine及創建startCoroutine原理_Andro
- 2022-06-02 EasyX實現自由落體小球_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支