asp.net core服務的生命週期

Transient:每一次GetService都會建立一個新的實例html

Scoped:在同一個Scope內只初始化一個實例 ,能夠理解爲( 每個request級別只建立一個實例,同一個http request會在一個 scope內)測試

Singleton:整個應用程序生命週期內只建立一個實例 ui

 

上面描述的比較抽象,不容易理解,用實例來說解會比較直觀。spa

下面經過具體的例子進行演示。code

定義三個空的接口:IArticleService、IProductService、IUserServicehtm

而後定義三個實現:ArticleService、ProductService、UserServiceblog

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類型的生命週期,每次請求都是同樣的

 

因此理解了生命週期的做用,咱們在開發的時候就能夠根據須要對不一樣的服務選擇不一樣的生命週期了。

相關文章
相關標籤/搜索