在Asp.Net core中的IServiceCollection容器中注冊服務的生命周期分以下3種:
1、Transient
通過AddTransient注冊,會在IServiceCollection容器每次被請求時創建實例。
暫時生存期服務 (AddTransient) 是每次從服務容器進行請求時創建的。 這種生存期適合輕量級、 無狀態的服務。
在處理請求的應用中,在請求結束時會釋放臨時服務。
2、Scoped
通過AddScoped注冊,會在每次客戶端請求時創建實例
作用域生存期服務 (AddScoped) 以每個客戶端請求(連接)一次的方式創建。
在處理請求的應用中,在請求結束時會釋放有作用域的服務。
警告
在中間件內使用有作用域的服務時,請將該服務注入至 Invoke
或 InvokeAsync
方法。
請不要通過構造函數注入進行注入,因為它會強制服務的行為與單一實例類似。
有關詳細信息,請參閱 寫入自定義 ASP.NET Core 中間件。
3、Singleton
通過AddSingleton注冊,會在第一次被請求時創建實例,之后的每個請求都會使用這個實例
單一實例生存期服務 (AddSingleton) 是在第一次請求時(或者在運行 Startup.ConfigureServices
並且使用服務注冊指定實例時)創建的。 每個后續請求都使用相同的實例。 如果應用需要單一實例行為,建議允許服務容器管理服務的生存期。 不要實現單一實例設計模式並提供用戶代碼來管理對象在類中的生存期。
在處理請求的應用中,在應用關閉,釋放 ServiceProvider 時,會釋放單一實例服務。
警告
從單一實例解析有作用域的服務很危險。 當處理后續請求時,它可能會導致服務處於不正確的狀態。
示例:
方法 |
自動 對象處置 |
多種 實現 |
傳遞參數 |
---|---|---|---|
Add{LIFETIME}<{SERVICE}, {IMPLEMENTATION}>() 示例: services.AddSingleton<IMyDep, MyDep>(); |
是 | 是 | 否 |
Add{LIFETIME}<{SERVICE}>(sp => new {IMPLEMENTATION}) 示例: services.AddSingleton<IMyDep>(sp => new MyDep()); services.AddSingleton<IMyDep>(sp => new MyDep("A string!")); |
是 | 是 | 是 |
Add{LIFETIME}<{IMPLEMENTATION}>() 示例: services.AddSingleton<MyDep>(); |
是 | 否 | 否 |
AddSingleton<{SERVICE}>(new {IMPLEMENTATION}) 示例: services.AddSingleton<IMyDep>(new MyDep()); services.AddSingleton<IMyDep>(new MyDep("A string!")); |
否 | 是 | 是 |
AddSingleton(new {IMPLEMENTATION}) 示例: services.AddSingleton(new MyDep()); services.AddSingleton(new MyDep("A string!")); |
否 | 否 | 是 |
測試注冊和生命周期如下:
結論:
Transient對象始終不同,每一次請求OperationID都會改改變。
Scoped對象在同一客戶端請求是相同的,但在多個客戶端是不同的。
Singleton,SingletonInstance對每個對象每個請求都是相同的。
代碼示例:https://files.cnblogs.com/files/Zhengxue/tryDotNetCoreDoc.zip