分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

asp.net core服务的生命周期

发布时间:2023-09-06 01:51责任编辑:胡小海关键词:暂无标签

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类型的生命周期,每次请求都是一样的

所以理解了生命周期的作用,我们在开发的时候就可以根据需要对不同的服务选择不同的生命周期了。

asp.net core服务的生命周期

原文地址:https://www.cnblogs.com/subendong/p/8969259.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved