.NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)
首先我们在VS2019中创建一个.NET Core的控制台程序,方便演示;
需要安装两个依赖包
Microsoft.Extensions.DependencyInjection 依赖注入对象的具体实现
Microsoft.Extensions.DependencyInjection.Abstractions 依赖注入对象的抽象
Part 1 : AddTransient AddScoped AddSingleton
话不多说,看以下Demo的代码以及运行结果
- public static class Demo
- {
- public interface IAccount { }
- public interface IMessage { }
- public interface ITool { }
- public class Base
- {
- public Base()
- {
- Console.WriteLine($"{GetType().Name} Created");
- }
- }
- public class Account : Base,IAccount { }
- public class Message : Base, IMessage { }
- public class Tool : Base, ITool { }
- public static void Run()
- {
- Console.WriteLine("Run Method Begin...");
- //root provider
- var rootProvider = new ServiceCollection()
- .AddTransient<IAccount, Account>()
- .AddScoped<IMessage, Message>()
- .AddSingleton<ITool, Tool>()
- .BuildServiceProvider();
- //create child provider
- var childProvider1 = rootProvider.CreateScope().ServiceProvider;
- var childProvider2 = rootProvider.CreateScope().ServiceProvider;
- GetService<IAccount>(childProvider1);
- GetService<IMessage>(childProvider1);
- GetService<ITool>(childProvider1);
- Console.WriteLine();
- GetService<IAccount>(childProvider2);
- GetService<IMessage>(childProvider2);
- GetService<ITool>(childProvider2);
- Console.WriteLine("Run Method End...");
- }
- public static void GetService<T>(IServiceProvider serviceProvider)
- {
- serviceProvider.GetService<T>();
- serviceProvider.GetService<T>();
- }
- }
调用Demo.Run() 输出结果
- Run Method Begin...
- Account Created
- Account Created
- Message Created
- Tool Created
- Account Created
- Account Created
- Message Created
- Run Method End...
- 调用GetService<T>方法获取实例进行实例的创建,Account、Message、Tool都继承了Base类,因此在被创建时,会调用Base类的构造函数;
- AddTransient => 每次请求都会创建一个新的实例
- 可以看到子容器childProvider1中 Account对象被创建了两次,因为可以看出AddTransient每次请求时都会创建一个新的实例;
- AddScoped => 同一个请求中返回同一个实例
在子容器的作用域中进行查找,同一个子容器中只会创建一次;所以childProvider1中调用两次GetService()方法只创建一次实列;
- childProvider2也只创建了一次Message
AddSingleton => 整个应用程序只会创建一次;单例永远从根容器rootProvider中查找
Tool 因为是Singleton 类型,因此整个程序中只创建了一次;
Part 2 : IDisposable
第二部分我们来看看创建的这些对象是何时进行释放的
在以上的代码中,将Base类实现IDisposable接口
- public class Base : IDisposable
- {
- public Base()
- {
- Console.WriteLine($"{GetType().Name} Created");
- }
- public void Dispose()
- {
- Console.WriteLine($"{GetType().Name} Disposed");
- }
- }
在Run方法中使用Using来测试结果:


- public static void Run()
- {
- //root provider
- using (ServiceProvider root = new ServiceCollection()
- .AddTransient<IAccount, Account>()
- .AddScoped<IMessage, Message>()
- .AddSingleton<ITool, Tool>()
- .BuildServiceProvider())
- {
- using (var scope = root.CreateScope())
- {
- var child = scope.ServiceProvider;
- child.GetService<IAccount>();
- child.GetService<IMessage>();
- child.GetService<ITool>();
- Console.WriteLine("Child provider begin dispose");
- }
- Console.WriteLine("Child provider disposed ");
- Console.WriteLine("Root provider begin dispose ");
- }
- Console.WriteLine("Root provider disposed ");
- }
测试结果
- Account Created
- Message Created
- Tool Created
- Child provider begin dispose
- Message Disposed
- Account Disposed
- Child provider disposed
- Root provider begin dispose
- Tool Disposed
- Root provider disposed
可以看出 AddTransient 和 AddScoped 在使用完child容器后,就调用了Base的 Dispose() ;而 AddSingle则在使用完root容器后再释放的;
.NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)的更多相关文章
- ASP.NET生命周期详解
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- ASP.NET生命周期详解 [转]
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- ASP.NET生命周期详解(转)
看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...
- React—组件生命周期详解
React—组件生命周期详解 转自 明明的博客 http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...
- ASP.NT运行原理和页面生命周期详解及其应用
ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用. ...
- Android之Activity生命周期详解
Activity的生命周期方法: onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->on ...
- Spring IOC -bean对象的生命周期详解
生命周期执行的过程如下:1) spring对bean进行实例化,默认bean是单例2) spring对bean进行依赖注入3) 如果bean实现了BeanNameAware接口,spring将bean ...
- Spring Bean的生命周期详解(转)
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)
JSP: JSP的生命周期指从创建到销毁的整个过程.分为以下几个阶段: 1:编译阶段:servlet引擎编译servlet源文件,生成servlet类.当浏览器请求JSP页面时,JSP引擎会首先去检查 ...
随机推荐
- CentOS 7 卸载 OpenJDK 安装 OracleJDK
查看 JDK 安装版本 java -version java version 1.7.0_51 OpenJDK Runtime Environment ( rhel-2.4.5.5.el7-x86_6 ...
- ABP 适用性改造 - 精简 ABP CLI 生成的项目结构
Overview 不管是公司或者个人都会有不同的开发习惯,通过建立项目模板,既可以使开发人员聚焦于业务功能的开发,也可以在一定程度上统一不同开发人员之间的开发风格.在使用 ABP 框架的过程中,对于 ...
- SqlServer视图的创建与使用
SqlServer系列之视图的创建与使用: 什么是视图? 视图的概述 在数据查询中,可以看到数据表设计过程中,考虑到数据的冗余度低.数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一 ...
- [矩阵乘法]裴波拉契数列II
[ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I [矩阵乘法]裴波拉契数列II [矩阵乘法]裴波拉契数列II Description 形如 1 1 2 3 5 8 13 21 34 55 89 ...
- Python数据分析入门(十七):绘制条形图
条形图的绘制方式跟折线图非常的类似,只不过是换成了plt.bar方法.plt.bar方法有以下常用参数: x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点. height:一个数组或者列表,代 ...
- .NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决
前言: 前段时间在对接第三方接口的时候发生了一个非常奇葩的问题,就是使用 .NET Framework 4.6 HttpWebRequest进行网络请求的相关问题.背景,关于调用第三方的接口都是使用使 ...
- 前端 JS 问题记录
立即执行函数 !function(){}() function 前面增加符号 ! ~ + - 之类,都是告诉浏览器自动执行这个匿名函数,因为这些符号的运算级别都是高的 (function(){... ...
- day19.进程通信与线程1
1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue 2 进程间通信:IPC -借助于Queue实现进程间通信 -借助于文件 -借助于数据库 -借助于消息队列:rabbitm ...
- JavaScript遍历对象方法总结
前言 本篇内容将按照下图展开: 遍历Object Object最常见的遍历方法方法就是使用for...in...,但其有一定的局限性,比如只能遍历可枚举属性.虽然Object无法直接使用for循环和f ...
- 什么时候选择mmap而非read?
mmap 和 read 系统流程 在linux文件系统中,通常使用open(), read()读取文件,但操作系统同样提供了mmap()作为读取文件的方式,而这两者有什么不同呢?什么时候用read() ...