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

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

最新文章

  1. MFC对话框显示BMP图片
  2. NODE.JS开发指南学习笔记2
  3. 关于html页面布局
  4. 【USACO】numtri
  5. 关于JS中变量的作用域-实例
  6. BeanUtils的日期问题
  7. Shell split character line by line
  8. Vue.js 学习笔记 一
  9. webpack前端工程化构建工具的使用
  10. linux_思想
  11. Python基础-week04
  12. 韩顺平dedecms讲解上课记录
  13. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
  14. JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder
  15. [Hive_10] Hive 的分析函数
  16. G1垃圾收集器的实现原理
  17. mongo 副本集
  18. 简述var、let、const三者的区别
  19. [转载]FlipClock.js时钟,计数,3D翻转插件
  20. 如何用两块硬盘做磁盘阵列的教程Raid 1

热门文章

  1. 3-html 缩写-地址-文字方向-引用块-题注的格式
  2. scrapy-redis(调度器Scheduler源码分析)
  3. Java对数
  4. hash&#183;余数hash和一致性hash
  5. js基础学习
  6. Socket通讯成功案例
  7. js中去除字符串中所有的html标签
  8. Python字符串编码转换
  9. windows 7 下用git
  10. 输出GPLT