首先我们在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 => 每次请求都会创建一个新的实例
可以看到子容器childProvider1Account对象被创建了两次,因为可以看出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 )生命周期详解 (对象创建以及释放)的更多相关文章

  1. ASP.NET生命周期详解

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  2. ASP.NET生命周期详解 [转]

    最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...

  3. ASP.NET生命周期详解(转)

    看到好文章需要分享. 最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多 ...

  4. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  5. ASP.NT运行原理和页面生命周期详解及其应用

    ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用.  ...

  6. Android之Activity生命周期详解

    Activity的生命周期方法: onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->on ...

  7. Spring IOC -bean对象的生命周期详解

    生命周期执行的过程如下:1) spring对bean进行实例化,默认bean是单例2) spring对bean进行依赖注入3) 如果bean实现了BeanNameAware接口,spring将bean ...

  8. Spring Bean的生命周期详解(转)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  9. JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)

    JSP: JSP的生命周期指从创建到销毁的整个过程.分为以下几个阶段: 1:编译阶段:servlet引擎编译servlet源文件,生成servlet类.当浏览器请求JSP页面时,JSP引擎会首先去检查 ...

随机推荐

  1. [源码分析] 消息队列 Kombu 之 Hub

    [源码分析] 消息队列 Kombu 之 Hub 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 中的 ...

  2. TextRank算法及生产文本摘要方法介绍

    TextRank 算法是一种用于文本的基于图的排序算法,其基本思想来源于谷歌的 PageRank算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之间的相似度作为边的权重,通过循环迭代 ...

  3. 归并排序(JAVA语言)

    public class merge { public static void main(String[] args) { // TODO Auto-generated method stub int ...

  4. Centos7安装Nacos单机模式以及集群模式(包含nignx安装以及实现集群)的相关配置

    Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos支持三种部署模式 单机模式 - 用于测试 ...

  5. mysql中FIND_IN_SET函数用法

    本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...

  6. [矩阵乘法]裴波拉契数列II

    [ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I [矩阵乘法]裴波拉契数列II [矩阵乘法]裴波拉契数列II Description 形如 1 1 2 3 5 8 13 21 34 55 89 ...

  7. [Fundamental of Power Electronics]-PART I-3.稳态等效电路建模,损耗和效率-3.2 考虑电感铜损

    3.2 考虑电感铜损 可以拓展图3.3的直流变压器模型,来对变换器的其他属性进行建模.通过添加电阻可以模拟如功率损耗的非理想因素.在后面的章节,我们将通过在等效电路中添加电感和电容来模拟变换器动态. ...

  8. 一文彻底掌握Apache Hudi的主键和分区配置

    1. 介绍 Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成.基于此设计Hudi可以将更新和删除快速应用于指定记录.Hudi使用分区路径字段对数据 ...

  9. Python简单实现杨辉三角

    n=input("请输入要打印的行数")n=int(n)for x in range(0,n+1): p=1 print(''.rjust(n-x),end="" ...

  10. Ubuntu安装docker/docker-compose(在全新系统状态下的安装)

    设置仓库 更新 apt 包索引. $ sudo apt-get update 安装 apt 依赖包,用于通过HTTPS来获取仓库: $ sudo apt-get install \ apt-trans ...