asp.net core服務的生命週期
Transient
:每一次GetService
都會建立一個新的例項Scoped
:在同一個Scope
內只初始化一個例項 ,可以理解為( 每一個request
級別只建立一個例項,同一個http request
會在一個scope
內)Singleton
:整個應用程式生命週期內只建立一個例項
上面描述的比較抽象,不容易理解,用例項來講解會比較直觀。
下面通過具體的例子進行演示。
定義三個空的介面:IArticleService、IProductService、IUserService
然後定義三個實現:ArticleService、ProductService、UserService
1.將介面和實現注入到DI
容器
在StartUp
類的ConfigureServices
方法新增下圖程式碼
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<Test>(Configuration.GetSection("Test"));
//演示生命週期
services.AddTransient<IUserService, UserService>();
services.AddScoped<IArticleService, ArticleService>();
services.AddSingleton<IProductService, ProductService>();
}
2.新增私有欄位,在測試Controller:LifeTimeController
中新增下圖程式碼
private readonly IUserService _userService1;
private readonly IUserService _userService2;
private readonly IArticleService _articleService1;
private readonly IArticleService _articleService2;
private readonly IProductService _productService1;
private readonly IProductService _productService2;
3.新增構造方法
public LifeTimeController(
IUserService userService1, IUserService userService2,
IArticleService articleService1, IArticleService articleService2,
IProductService productService1, IProductService productService2
)
{
_userService1 = userService1;
_userService2 = userService2;
_articleService1 = articleService1;
_articleService2 = articleService2;
_productService1 = productService1;
_productService2 = productService2;
}
4.新增測試程式碼
public IActionResult Index()
{
var sb = new StringBuilder();
sb.Append("transient1:" + _userService1.GetHashCode() + "<br />");
sb.Append("transient2:" + _userService2.GetHashCode() + "<br />");
sb.Append("scope1:" + _articleService1.GetHashCode() + "<br />");
sb.Append("scope2:" + _articleService2.GetHashCode() + "<br />");
sb.Append("singleton1:" + _productService1.GetHashCode() + "<br />");
sb.Append("singleton2:" + _productService2.GetHashCode() + "<br />");
Response.ContentType = "text/html";
return Content(sb.ToString());
}
5.執行結果
第一次重新整理:
transient1:66454027
transient2:35021870
scope1:38350037
scope2:38350037
singleton1:4417230
singleton2:4417230
第二次重新整理:
transient1:103653
transient2:5079042
scope1:47546512
scope2:47546512
singleton1:4417230
singleton2:4417230
可見
transient
型別的生命週期,每次使用都不一樣,不同的類或不同的方法使用都不一樣scope
型別的生命週期,在同一個請求內是一樣的singleton
型別的生命週期,每次請求都是一樣的
所以理解了生命週期的作用,我們在開發的時候就可以根據需要對不同的服務選擇不同的生命週期了。
相關文章
- 2、ASP.NET Core中服務的生命週期ASP.NET
- ASP.NET頁面生命週期與應用程式生命週期ASP.NET
- 18_三種服務的生命週期:Singleton、Scoped 和 Transient
- Android四大元件之服務————服務的生命週期和啟動方式Android元件
- View生命週期與Activity生命週期的關係View
- ASP.NET 伺服器控制元件的生命週期ASP.NET伺服器控制元件
- 生命週期
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- 品牌生命週期和產品生命週期之間的關係
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- 微服務業務生命週期流程管控引擎微服務
- React新的生命週期React
- iOS APP的生命週期iOSAPP
- Vue生命週期的理解Vue
- Java 物件的生命週期Java物件
- Avalonia的Window生命週期
- Flutter widget的生命週期Flutter
- Spring Bean的生命週期SpringBean
- Spring的生命週期主Spring
- Spring Bean 的生命週期SpringBean