首页 > 其他分享 >Microsoft.Extensions.DependencyInjection会自动释放通过DI(依赖注入)创建的对象

Microsoft.Extensions.DependencyInjection会自动释放通过DI(依赖注入)创建的对象

时间:2024-06-02 20:11:06浏览次数:23  
标签:People ServiceProvider DI Dispose rootServiceProvider Extensions IPeople Depende

Microsoft.Extensions.DependencyInjection中(下面简称DI),在调用ServiceProvider和IServiceScope对象的Dispose()方法时,也会自动调用ServiceProvider和IServiceScope对象通过DI创建的对象的Dispose()方法(前提是,通过DI创建的对象实现了IDisposable接口)。

我们新建一个.NET Core控制台项目,然后假设我们有接口IPeople和类People,类People实现了接口IPeople和IDisposable,接口IPeople和类People之间的依赖注入关系是Transient。

如果我们用ServiceProvider对象通过DI创建一个People对象,那么当调用ServiceProvider对象的Dispose()方法时,People对象的Dispose()方法也会被自动调用:

using Microsoft.Extensions.DependencyInjection;
using System;

namespace NetCoreDITransientInScope
{
    interface IPeople
    {
        void DoSomething();
    }

    class People : IPeople, IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("Disposing People");
        }

        public void DoSomething()
        {
            Console.WriteLine("DoSomething is running");
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            IServiceCollection services = new ServiceCollection();
            services.AddTransient<IPeople, People>();//注册接口IPeople和类People的关系为Transient

            ServiceProvider rootServiceProvider = null;

            try
            {
                rootServiceProvider = services.BuildServiceProvider();
                IPeople people = rootServiceProvider.GetService<IPeople>();
                people.DoSomething();
            }
            finally
            {
                if (rootServiceProvider != null)
                {
                    rootServiceProvider.Dispose();//调用ServiceProvider.Dispose()方法,也会调用ServiceProvider通过DI创建的people对象的Dispose()方法
                }
            }

            Console.WriteLine("Press any key to end...");
            Console.ReadKey();
        }
    }
}

 

如果我们用IServiceScope对象的ServiceProvider通过DI创建一个People对象,那么当调用IServiceScope对象的Dispose()方法时,People对象的Dispose()方法也会被自动调用:

using Microsoft.Extensions.DependencyInjection;
using System;

namespace NetCoreDITransientInScope
{
    interface IPeople
    {
        void DoSomething();
    }

    class People : IPeople, IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("Disposing People");
        }

        public void DoSomething()
        {
            Console.WriteLine("DoSomething is running");
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            IServiceCollection services = new ServiceCollection();
            services.AddTransient<IPeople, People>();//注册接口IPeople和类People的关系为Transient

            ServiceProvider rootServiceProvider = null;
            IServiceScope serviceScope = null;

            try
            {
                rootServiceProvider = services.BuildServiceProvider();

                try
                {
                    serviceScope = rootServiceProvider.CreateScope();
                    IPeople people = serviceScope.ServiceProvider.GetService<IPeople>();
                    people.DoSomething();
                }
                finally
                {
                    if (serviceScope != null)
                    {
                        serviceScope.Dispose();//调用IServiceScope.Dispose()方法,也会调用在serviceScope中DI创建的people对象的Dispose()方法
                    }
                }

            }
            finally
            {
                if (rootServiceProvider != null)
                {
                    rootServiceProvider.Dispose();
                }
            }

            Console.WriteLine("Press any key to end...");
            Console.ReadKey();
        }
    }
}

 

关于Microsoft.Extensions.DependencyInjection会自动释放DI创建的对象,可以查看下面这篇微软的官方文档:

Disposal of services

 

关于Microsoft.Extensions.DependencyInjection的详细介绍,可以查看下面微软的官方文档:

.NET dependency injection

 

标签:People,ServiceProvider,DI,Dispose,rootServiceProvider,Extensions,IPeople,Depende
From: https://www.cnblogs.com/OpenCoder/p/18227541

相关文章

  • vscode setting.js 中 $dir 突然多了一对双引号的问题
    找到文件codeManager.js可以通过everything快速查找,或者找到以下路径:C:\Users\你的用户名\.vscode\extensions\formulahendry.code-runner-0.12.2\out\src先找到$dir替换函数从上图可以看出函数quoteFileName做了主要工作把引号去掉就好了......
  • Redis
    Redis(RemoteDictionaryServer),即远程字典服务,是一个开源的使用ANSIC语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis的数据结构丰富,支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和h......
  • toughradius快速安装
    ctoughradius快速安装1.下载二进制安装toughradiuscd/usr/local/bin/wgethttps://github.com/talkincode/toughradius/releases/download/v8.0.8/toughradius_amd64mvtoughradius_amd64toughradiuschmod+xtoughradiustoughradius-install2.systemd管理(自动生成的)......
  • Redis设计与实现(一)SDS与C字符串的对比
    sds的定义:每个sds.h/sdshdr结构表示一个SDS值:struct__attribute__((__packed__))sdshdr8{uint8_tlen;/*used*/uint8_talloc;/*excludingtheheaderandnullterminator*/unsignedcharflags;/*3lsboftype,5unusedbits*/char......
  • Redis单线程
    Redis是基于Reactor模式开发的网络事件处理器,这个处理器是单线程的,所以redis是单线程的。为什么它是单线程还那么快呢?主要有以下几个原因:一、纯内存操作由于Redis是纯内存操作,相比于磁盘来说,内存就快得多,这个是Redis快的主要原因。二、多路复用I/O机制(NIO)Re......
  • Linux系统上配置redis开机自启
    Redis开机自启:第一步添加环境变量:命令:vim/etc/profile在结尾添加:exportPATH=$PATH:/usr/local/redis/bin作用是为了后续脚本的启动命令不需写的过长重载环境变量文件:source/etc/profile第二步:编写redis.service节点1:152服务器vim/etc/systemd/system/redis.service添......
  • 萌新打代码(Recording)
    使用的资源:acwing课程,cf,pta核心:Recording分配预期:    1.acwing为长战线,放在空余时间多的假期,并分解为多个deadline    2.cf为临时线,在一个cf发布后的2天内完成,解析下的Recording    3.pta为日常线,在每天的晚饭前完成1到2题,如果没有很强的意愿完成......
  • Redis的分布式缓存问题
    击穿  Redis曾存在的key,由于过期时间而被删除,导致请求跳过redis而访问DB处理方法:不设置过期时间,永远存在使用锁,synchronized、分布式锁布隆过滤器穿透  数据库与redis都不存在的key,由于莫名原因存在大量请求,导致请求跳过redis而访问DB处理方法:数据库不存在,redis也......
  • Redis 高级应用与性能优化
    目录1.Redis集群与高可用性Redis集群介绍高可用性方案与实践2.Redis性能优化与监控性能指标与监控工具Redis的性能优化策略实时监控与故障排查3.Redis实践场景与最佳实践缓存与缓存雪崩、击穿、穿透计数器和限流器的实现分布式锁的应用实际项目中的Redis......
  • Day 9:2829. k-avoiding 数组的最小总和
    Leetcode2829.k-avoiding数组的最小总和给你两个整数n和k。对于一个由不同正整数组成的数组,如果其中不存在任何求和等于k的不同元素对,则称其为k-avoiding数组。返回长度为n的k-avoiding数组的可能的最小总和。n个不同正整数的最小总和,那就是从1......