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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python调试_Python调试坑

写python的人一般都不太看重调试&#xff0c; 因为这是一门解释性语言&#xff0c; 在哪出错会立马在解释器里提示出来。但是&#xff0c; 以上观点只适用于小的脚本或者项目。因为我在接触目前项目之前&#xff0c; 我一直都是这么做的。 对于一个大的项目来说&#xff0c; 调…

[蓝桥杯]字符串对比-模拟

题目描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间)&#xff0c;它们之间的关系是以下4中情况之一&#xff1a;   1&#xff1a;两个字符串长度不等。比如 Beijing 和 Hebei   2&#xff1a;两个字符串不仅长度相等&#xff0c;而且相应位置上的字符…

word List 42

word List 42 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

利用AppMetrics对Web进行监控教程

一、基础准备1. 安装依赖这里可以通过nuget或使用命令行进行安装&#xff0c;具体需要安装的类库如下&#xff08;注意版本&#xff09;&#xff1a;Install-Package App.Metrics.AspNetCore.Mvc -Version 2.0.0由于我们需要兼容Prometheus进行监控&#xff0c;所以我们还需要安…

matlab贝叶斯优化工具箱_经济学人的神器——BEAR(贝叶斯估计、分析和回归工具包)...

武林至尊&#xff0c;宝刀屠龙&#xff0c;号令天下&#xff0c;莫敢不从&#xff0c;倚天不出&#xff0c;谁与争锋。——金庸《倚天屠龙记》Bayesian Estimation, Analysis and Regression(简写为BEAR) Toolbox是欧央行(ECB)发布的一个综合 (面板)VAR工具箱&#xff0c;通过图…

[蓝桥杯2017决赛]平方十位数-枚举+set去重

题目描述 由0~9这10个数字不重复、不遗漏&#xff0c;可以组成很多10位数字。 这其中也有很多恰好是平方数&#xff08;是某个数的平方&#xff09;。 比如&#xff1a;1026753849&#xff0c;就是其中最小的一个平方数。 请你找出其中最大的一个平方数是多少&#xff1f; 输出…

计算机网络----wireshark抓包

计算机网络----wireshark抓包 抓包截图&#xff1a; 先了解&#xff0c;后期将细讲&#xff01;&#xff01;&#xff01; 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

如何为.NETCore安装汉化包智能感知

引言具体不记得是在群里还是什么地方有人问过&#xff0c;.NETCore有没有汉化包&#xff0c;答案是有&#xff0c;目前微软已经为我们提供了.NETCore多种语言的语言包。下面看看如何安装与使用吧。本文介绍&#xff1a;如何安装这些下载的本地化版本。如何修改Visual Studio安装…

python对浏览器的常用操作_selenium+python基本操作(02)

前言 前一章节已经完成环境搭建&#xff0c;下面简单介绍下对浏览器的基本操作&#xff0c;让大家先了解一些简单的操作。这节主要介绍浏览器打开、刷新、前进、后退、截图、退出等功能。 1&#xff09;打开浏览器 from selenium import webdriver #导入webdriver模块 driver …

[召集令]-Dijkstra的单源最短路径算法

2021.3.10 题目背景 墨家家主发出召集令&#xff0c;所有弟子得迅速到指定地点集合。 题目描述 给定一张地图&#xff0c;含有n个地点(n<10000)&#xff0c;地点从1开始编号&#xff0c;地图上还含有m条单向路(m<100000)连接着这些地点&#xff0c;墨家家主在1号位置&am…

word List 43

word List 43 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

小微技术团队的DevOps体系折腾之路(顺带发布52ABP新版本)

加个“星标★”&#xff0c;好文必达&#xff01;本想纯粹说下52ABP新版本发布&#xff0c;但是写着写着,过去的时间更多折腾的是DevOps体系的建设。这篇同样适用于小公司或者个人开发者脱离人肉运维的方法。说下52ABP&#xff0c;我们发布了新版本&#xff0c;版本号3.1.0&…

python递归创建目录_Node.js和Python使用递归查看目录文件和创建目录

1. 查看目录文件: 1.1 Node实现&#xff1a; let fs require(fs); let path require(path); let filePath path.resolve(D:); fileDisplay(filePath); function fileDisplay(filePath){ //根据文件路径读取文件&#xff0c;返回文件列表 fs.readdir(filePath,function(err,f…

管理学定律--彼得原理

彼得原理由美国管理学家劳伦斯彼得&#xff08;Laurence&#xff0e;J&#xff0e;Peter&#xff09;根据千百个有关组织中不能胜任的失败实例的分析而归纳出来&#xff0c;于1960年的一次研习会上提出。其具体内容是&#xff1a;“在一个等级制度中&#xff0c;每个员工趋向于…

word List44

word List44 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

C++用Prim算法实现无向图最小生成树

#include <iostream> using namespace std; #define INFINE 99999999//假装自己是无穷大 const int N 1010; int graph[N][N]; int vertexnum, arcnum; //lowcost[i]:表示以i为终点的边的最小权值, //当lowcost[i]0说明以i为终点的边的最小权值0, //也就是表示i点加入了…

python序列数据类型_Python 数据类型 之 序列类型

序列&#xff1a;表示索引为非负整数的有序对象集合&#xff0c;所有序列都支持迭代 序列类型有&#xff1a;字符串&#xff0c;列表&#xff0c;元组 三种 字符串也是一种序列 列表和元组是任意python对象的序列或叫有序集合 字符串和元组不可变序列&#xff0c;列表支持插入、…

word List 45

word List 45 One of the pressing problems our nation faces today is how to strike a balance between economic development and environmental protection. 我们国家当今面临的最紧迫的问题之一就是如何平衡经济发展和环境保护之间的关系。 Corruption has existed since…

2020 年 中国.NET开发者调查报告

微信公众号dotnet跨平台2020年初做的一个关于中国.NET开发者调查收到了开发者近 1400 条回复。这份调查报告涵盖了开发者工具链的所有部分&#xff0c;包括编程语言、应用架构、应用服务器、运行时平台、框架技术、框架配置、IDE、.NET/.NET Core 发行版部署模式、构建工具和Ku…

C++实现有向图最短路径-Dijkstra单源最短路径算法

#include <iostream> using namespace std; #define INFINE 99999999//假装我是无穷大 const int N 1010; bool vis[N]; int dis[N]; int graph[N][N];//图 //Dijkstra算法计算点v到图上各个点的最短距离 void Dijkstra(int graph[][N], int v, int n) {//v为起点,//n为…