内容简介:作用域主要由 IServiceScope 这个接口来承载对于实现 IDisposable 类的实例的对象,容器会负责对其生命周期进行管理,使用完毕之后,他会释放这些对象实现 IDisposable 接口类型的释放:
06 | 作用域与对象释放行为
作用域主要由 IServiceScope 这个接口来承载
对于实现 IDisposable 类的实例的对象,容器会负责对其生命周期进行管理,使用完毕之后,他会释放这些对象
实现 IDisposable 接口类型的释放:
-
1、容器只会负责由其创建的对象,如果这个对象是自己创建出来并放到容器里的,容器不负责释放这个对象
-
2、在容器和子容器释放时,容器才会去释放这些对象,也就是说容器的生命周期与其创建的对象的生命周期是有对应关系的
两点建议:
-
1、在根容器,最好不要创建实现了 IDisposable 瞬时服务
-
2、避免手动创建实现了 IDisposable 对象,然后塞到容器里面,应该尽可能地使用容器来管理我们对象的创建和释放
演示代码:
https://github.com/witskeeper/geektime/tree/master/samples/DependencyInjectionScopeAndDisposableDemo
先看一下服务
namespace DependencyInjectionScopeAndDisposableDemo.Services { public interface IOrderService { } public class DisposableOrderService : IOrderService, IDisposable { public void Dispose() { Console.WriteLine($"DisposableOrderService Disposed:{this.GetHashCode()}"); } } }
首先定义 IOrderService
接着定义 IOrderService 的实现 DisposableOrderService,并实现了 IDisposable 这个接口
在释放的时候打印释放信息,并输出对象的 HashCode
接着是服务注册(Startup)
services.AddTransient<IOrderService,DisposableOrderService>();
这里先注册一个瞬时服务,将 IOrderService 注册进去
然后看一下控制器(WeatherForecastController)
[HttpGet] public int Get([FromServices] IOrderService orderService, [FromServices] IOrderService orderService2) { return 1; }
这里 FromServices 获取了两次 IOrderService
这里不需要写任何代码对它进行操作,因为整个生命周期是由容器去管理的
启动程序,输出如下:
DisposableOrderService Disposed:10579059 DisposableOrderService Disposed:47945396
可以看出,执行完毕之后,DisposableOrderService 会被释放掉,并且两个对象都会被释放掉
两个对象的 HashCode 不同
瞬时服务在每一次获取的时候都会获得一个新的对象
接着,添加一行代码表示服务
[HttpGet] public int Get([FromServices] IOrderService orderService, [FromServices] IOrderService orderService2) { Console.WriteLine("接口请求处理结束"); return 1; }
输出一下,表示我们的接口已经访问完毕,看一下释放时机在哪里
启动程序,输出如下:
接口请求处理结束 DisposableOrderService Disposed:35023218 DisposableOrderService Disposed:13943705
由此看出,接口请求处理结束后,才释放对象
接下来看一下 Scoped 模式
服务注册
services.AddScoped<IOrderService>(p => new DisposableOrderService());
控制器
[HttpGet] public int Get([FromServices] IOrderService orderService, [FromServices] IOrderService orderService2) { Console.WriteLine("=======1=========="); // HttpContext.RequestServices // 是当前请求的一个根容器 // 应用程序根容器的一个子容器 // 每个请求会创建一个容器 using (IServiceScope scope = HttpContext.RequestServices.CreateScope()) { // 在这个子容器下面再创建一个子容器来获取服务 var service = scope.ServiceProvider.GetService<IOrderService>(); } Console.WriteLine("=======2=========="); Console.WriteLine("接口请求处理结束"); return 1; }
启动程序,输出如下:
=======1========== DisposableOrderService Disposed:31307802 =======2========== 接口请求处理结束 DisposableOrderService Disposed:31614998
每次请求会获得两个释放,意味着每创建一个 Scoped 的作用域,每个作用域内可以是单例的
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 漫画:如何证明sleep不释放锁,而wait释放锁?
- golang内存释放
- 【缺陷周话】第13期:二次释放
- Rietspoof恶意软件释放多个恶意有效载荷
- CocosCreator 引擎资源加载与释放原理简析
- 魔法书1:利用底层代码释放Arduino空间
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
图解网站分析(修订版)
[日] 小川卓 / 沈麟芸 / 人民邮电出版社 / 2014-10 / 69.00元
本书以图配文,结合实例详细讲解了如何利用从网站上获取的各种数据了解网站的运营状况,如何从数据中攫取最有用的信息,如何优化站点,创造更大的网站价值。本书适合各类网站运营人员阅读。 第1 部分介绍了进行网站分析必备的基础知识。第2 部分详细讲解了如何明确网站现状,发现并改善网站的问题。第3 部分是关于流量获取和网站内渠道优化的问题。第4 部分介绍了一些更加先进的网站分析方法,其中详细讲解了如何分......一起来看看 《图解网站分析(修订版)》 这本书的介绍吧!