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 的作用域,每个作用域内可以是单例的

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)相关推荐

  1. .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)

    06 | 作用域与对象释放行为 接下来,把服务切换为单例模式,通过工厂的方式 services.AddSingleton<IOrderService>(p => new Dispos ...

  2. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  3. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  4. ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记

    最近公司产品上线,通宵加班了一个月,一直没有更新,今天开始恢复,每日一更,冲冲冲 任务13:详解oauth2授权码流程 我们即将开发的产品有一个用户 API,一个项目服务 API,每个服务都需要认证授 ...

  5. ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记

    任务20:Consent Controller Get请求逻辑实现 接着上一节的思路,实现一下 ConsentController 根据流程图在构造函数注入 IClientStore,IResourc ...

  6. 大数据开发工程师基本功修炼之史上最全Linux学习笔记(建议)

    我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励. 2021年「博客之星」参赛博主:Maynor大数据 (感谢礼品.红包免费送!) https://bbs.csdn.ne ...

  7. 跟我一起学.NetCore之依赖注入作用域和对象释放

    前言 上一小节简单阐述了依赖注入及Asp.NetCore中自带依赖注入组件的常规用法,其中提到容器管控了自己创建对象的生命周期,包含了三种生命周期:Singleton.Scoped.Transient ...

  8. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  9. 【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(4.1-4.10)

    [全栈之巅]Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(4.1-4.10) 本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会 https://git ...

最新文章

  1. 重磅!明略发布数据中台战略和三大解决方案
  2. 来自妹子的需求:App的logo自动切图脚本
  3. 想转行到机器学习,学到什么程度,才能找到工作?
  4. gnuplot 常用命令大全
  5. python sqlserver2008_Python爬取sql server 2008数据
  6. Frame Stacking 框架堆叠
  7. linux不允许将硬链接指向目录,为什么 UNIX/Linux 不允许目录硬链 【翻译】
  8. struts2源码系列(3)--拦截器
  9. Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表
  10. notepad++7.3.1中文版
  11. [原创] IE中的图片显示不出来
  12. 瑞盟高精度模数转换器,MS1242,MS1243,
  13. 流式计算利器-Storm
  14. win10在哪找计算机配置,电脑教程:windows10的设置在哪
  15. nachos操作系统(一)
  16. win10安装GDCM以期用pydicom读取jpeg无损压缩过的DICOM文件
  17. 一文搞定敏捷项目管理精华,40张PPT直接拿去
  18. 7.HTML中常见的列表元素有哪些,任务7——HTMl表单、列表等使用
  19. 分布式系统灰度发布实践
  20. 【python 图片识别】python识别图片是不是包含二维码

热门文章

  1. 下拉刷新:继承listView控件
  2. C#备份数据和还原数据
  3. 用SQL Server Compact Edition创建移动应用程序 【转载】
  4. (转)程序员的十层楼11层(上帝)
  5. 在Firefox中结合Wolfram Alpha和Google搜索结果
  6. outlook日历不显示_如何在Outlook Online中突出显示不同的日历
  7. php 执行文件tar打包,利用tar for windows对大量文件进行快速打包
  8. 修复删除/var/lib/dpkg目录后,无法使用apt-get命令问题
  9. 基于DeepConvLSTM的传感器信号分类
  10. Spring Boot 使用Redis