依赖注入生命周期

介绍

  • 依赖注入只负责由其创建的对象实例

  • 容器或者子容器释放的时候,会释放由其创建的对象实例。

推荐使用容器来来管理我们的对象的创建和释放。

操作

为了演示,我们创建一个UserService,并让该Service继承IDisposable

public class UserService : IUserService, IDisposable
{public int Sum(int x, int y){return x + y;}public void Dispose(){Console.WriteLine($"UserService服务被释放  {this.GetHashCode()}");}
}
public interface IUserService
{int Sum(int x, int y);
}

在控制器中我们通过FromServices去注入IUserService

[HttpGet]
public string Get([FromServices] IUserService userService, [FromServices] IUserService userService2)
{Console.WriteLine($"当前创建的UserService  {userService.GetHashCode()}");Console.WriteLine($"当前创建的UserService2  {userService2.GetHashCode()}");//为当前请求创建一个子容器,一次请求会创建一次using (var scope = HttpContext.RequestServices.CreateScope()){var service = scope.ServiceProvider.GetRequiredService<IUserService>();Console.WriteLine($"子容器创建的UserService  {service.GetHashCode()}");Console.WriteLine($"子容器创建的UserService处理完毕");}Console.WriteLine("接口处理完毕 ");return DateTime.Now.ToString();
}

瞬时生命周期

现在我们将刚才的服务注册为瞬时生命周期

services.AddTransient<IUserService, UserService>();

运行查看对象释放的时机,输出结果

// 第一次请求结束
当前创建的UserService  35827753
当前创建的UserService2  4419630
子容器创建的UserService  40124269
子容器创建的UserService处理完毕
UserService服务被释放  40124269
接口处理完毕
UserService服务被释放  4419630
UserService服务被释放  35827753// 第二次请求结束       
当前创建的UserService  17653682
当前创建的UserService2  42194754
子容器创建的UserService  15688314
子容器创建的UserService处理完毕
UserService服务被释放  15688314
接口处理完毕
UserService服务被释放  42194754
UserService服务被释放  17653682

通过结果可以得出结论,瞬时生命周期对象的释放在这次请求结束的时候释放,并且一次请求可能产生多次实例,多次请求产生多次实例。

但是如果我们是在跟容器进行获取的瞬时服务,那么它就不是请求结束的时候释放了。

ConfigureServices中注册

services.AddTransient<IUserService,UserService>();

Configure中配置

var servise = app.ApplicationServices.GetService<IUserService>();
Console.WriteLine(servise.Sum(1, 2));

会在项目启动的时候进行输出,中间调用接口并不会释放服务,当程序关闭的时候释放服务

info: Microsoft.Hosting.Lifetime[0]Application is shutting down...
UserService服务被释放  30995104

范围生命周期

现在我们将刚才的服务注册为范围生命周期

services.AddScoped<IUserService, UserService>();
// 或者
services.AddTransient<IUserService>(p => new UserService());

运行查看对象释放的时机,输出结果

// 第一次请求结束
当前创建的UserService  43182754
当前创建的UserService2  43182754
子容器创建的UserService  49229074
子容器创建的UserService处理完毕
UserService服务被释放  49229074
接口处理完毕
UserService服务被释放  43182754// 第二次请求结束    
当前创建的UserService  28952583
当前创建的UserService2  28952583
子容器创建的UserService  51571199
子容器创建的UserService处理完毕
UserService服务被释放  51571199
接口处理完毕
UserService服务被释放  28952583

通过结果可以得出结论,范围生命周期对象的释放在这次请求结束的时候释放,并且一次请求内只产生一次实例,多次请求产生多次实例。

单例生命周期

现在我们将刚才的服务注册为范围生命周期

services.AddSingleton<IUserService, UserService>();

运行查看对象释放的时机,输出结果

// 第一次接口请求结束
当前创建的UserService  26224738
当前创建的UserService2  26224738
子容器创建的UserService  26224738
子容器创建的UserService处理完毕// 第二次
接口处理完毕
当前创建的UserService  26224738
当前创建的UserService2  26224738
子容器创建的UserService  26224738
子容器创建的UserService处理完毕
接口处理完毕// 当Ctrl+C关闭程序
info: Microsoft.Hosting.Lifetime[0]Application is shutting down...
UserService服务被释放  13588007

通过结果可以得出结论,单例生命周期对象的释放在程序停止运行的时候释放,并且多次请求只产生一次相同的实例。

当服务是我们自己创建的然后再次测试

var userService = new UserService();
services.AddSingleton<IUserService>(userService);

只有单例模式下支持该方式,可能故意限制的

输出结果

// 第一次请求
当前创建的UserService  62006733
当前创建的UserService2  62006733
子容器创建的UserService  62006733
子容器创建的UserService处理完毕
接口处理完毕// 第二次请求
当前创建的UserService  62006733
当前创建的UserService2  62006733
子容器创建的UserService  62006733
子容器创建的UserService处理完毕
接口处理完毕//关闭程序
info: Microsoft.Hosting.Lifetime[0]Application is shutting down...

通过结果得出结论,我们自己创建的实例,并不通过容器管理,也就是说不会自己释放。

小知识

如何实现通过调用接口关闭应用程序

[HttpGet]
public void StopApplication([FromServices] IHostApplicationLifetime lifetime)
{lifetime.StopApplication();
}

通过注入IHostApplicationLifetime然后执行StopApplication来停止应用程序。

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

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

相关文章

常用网络面试题一

1、 win2000,win2003个有几个版本&#xff0c;每个版本最新系统补丁包是什么啊&#xff1f; 2、 DNS的实现方法&#xff1f; 3、 WEB服务器的负载均衡&#xff1f; 4、 请问目前市面上常用几种网络操作系统的优缺点&#xff1f; 5、 请问你用过那些服务器&#xff1f;请讲述rai…

《划时代-51单片机C语言全新教程》-第四章 工程创建与深入 概览

&#xff08;请复制整个下载地址到迅雷、快车、QQ旋风进行下载&#xff09; 电子书下载地址&#xff1a;http://files.cnblogs.com/wenziqi/划时代&#xff0d;51单片机C语言全新教程.rar转载于:https://www.cnblogs.com/wenziqi/archive/2010/07/05/1771281.html

java模拟火车站买票的过程_Java常用代理

在我们通常的应用中&#xff0c;代理模式也是我们常用的设计模式之一。所谓的代理模式是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理对象&#xff0c;来间接的调用实际的对象。为什么要采用这种间接的形式来调用对象呢&#xff1f;一般是因为客户端不想访问实…

网络繁杂,我们该如何准确获取所需信息?

全世界只有3.14 % 的人关注了爆炸吧知识网络已经成为了很多人发表言论的地方不少网站亦难免存在宣泄情绪的内容网络繁杂&#xff0c;该如何获取准确信息&#xff1f;下面为你推荐一些客观公号希望能让你扩展视野&#xff0c;增长见识&#xff01;【关注方式 】1 - 搜索公众号ID…

.NET 6 新特性 WaitAsync

.NET 6 新特性 WaitAsyncIntro在 .NET 6 里新增加了一个 WaitAsync 的方法&#xff0c;用来异步地等待一个任务完成&#xff0c;异步等待的时候可以指定一个 Timeout 时间或者一个取消令牌 CancellationToken&#xff0c;在之前的版本中只有一个同步的 Wait 会等待任务的完成&a…

局域网dos命令集

开启服务命令&#xff1a;net start 服务名信使服务&#xff1a;先开启messenger服务。net send ip "消息文本"局域网dos命令集ls命令是我们常用的几个命令&#xff0c;但是其中有一些很有用的参数我们往往不是很清楚&#xff0c;现在介绍如下&#xff1a; -t -c 按照…

优秀编程网站收录集锦

陆续更新中&#xff0c;敬请关注&#xff1a; 中国开源网&#xff1a;http://www.yuanma.org/ 编程爱好者&#xff1a;http://blog.pfan.cn/vfdff/33993.html 全国嵌入式人才培训基地: http://learn.akae.cn/media/ch21s03.html 转载于:https://www.cnblogs.com/Jessy/archive…

jdbc连接mysql的语法_JDBC连接MySQL

JDBC连接MySQL加载及注册JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance();JDBC URL定义驱动程序与数据源之间的连接标准语法&#xff1a;::MySQL的JDBCURL格式&#xff1a;jdbc:mysql//[hostna…

被评为“影响世界千年的物理学家”,杨振宁的伟大,你根本不了解

全世界只有3.14 % 的人关注了爆炸吧知识2018年3月14日&#xff0c;英国科学家霍金去世&#xff0c;作为当代英国最杰出的科学家之一&#xff0c;英国用最规格的方式送别了这位伟大的科学家。霍金去世了&#xff0c;中国媒体沸腾了&#xff01;有人说&#xff1a;这是全人类的损…

[1197]约瑟夫问题 (循环链表)SDUT

约瑟夫问题 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 n个人想玩残酷的死亡游戏&#xff0c;游戏规则如下&#xff1a; n个人进行编号&#xff0c;分别从1到n&#xff0c;排成一个圈&#xff0c;顺时针从1开始数到m&#xff0c;数到m…

Blazor+Dapr+K8s微服务之服务调用

1.1 Dapr环境配置1.1.1 在开发机安装Docker Desktop并启用Kubernetes安装过程略&#xff0c;安装好后效果如下&#xff1a;&#xff08;左下角两个绿色指示Docker和K8s正在运行&#xff09;1.1.2 在开发机安装Dapr Cli安装命令&#xff1a;powershell -Command …

squid2.6加速WEB支持虚拟主机配置心得体会 .txt

人一台web服务器&#xff0c;日流量约10万&#xff0c;上面有好几个虚拟主机&#xff0c;近日装上Squid 2.6进行WEB加速&#xff0c;Squid 和Apache均在同一台服务器上面&#xff0c;效果非常明显&#xff0c;看到论坛上好多人问如何配置squid2.6支持,虚拟主机现在将安装过程贴…

IT职涯路

在51cto周刊上发现了这篇文章&#xff0c;不错&#xff0c;转载过来~~ 前段时间看了一篇文章&#xff0c;叫做《IT人为什么难以拿高薪》&#xff0c;颇有感触&#xff0c;于是写下这篇文章&#xff0c;希望与各位XDJM共勉&#xff5e; 能够看到这个帖子的每个XDJM&#xff0c;…

mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)

查看插件&#xff1a;mysql> show plugins;mysql> select plugin_name,plugin_status,plugin_type,load_option,plugin_library from information_schema.plugins;默认插件目录&#xff1a;mysql> show variables like plugin_dir;----------------------------------…

11部高分学科纪录片,助力孩子涨姿势拓视野~

全世界只有3.14 % 的人关注了爆炸吧知识▌导读本文为同学们整理了11部高分经典学科纪录片&#xff0c;对应文学、数学、经济学、地理、化学、生物、物理、历史、社会学、美学、天文学11个学科。这不仅是课堂学习的补充与延伸&#xff0c;更是开拓视野、激发学习内驱力的绝佳利器…

Istio 首次安全评估结果公布

本文译自 Istio 社区官方博客 Announcing the results of Istio’s first security assessment[1]&#xff0c;作者 Neeraj Poddar&#xff0c;译者宋净超。Istio 服务网格已在各行各业获得广泛的生产应用。该项目的成功&#xff0c;以及其在基础设施中执行关键安全策略的重要用…

mile for gallon 汽车省油

计算汽车省油&#xff0c;用英里每加仑比较&#xff0c;允许重复比较//mile for gallon 汽车省油 #include<iostream>const double GALLON 0.264179; double milepergallon(double kilo,double mile);int main() {using namespace std;double kilo[2],mile[2],milebygal…

使用C#制作简易的注册表编辑器

本文节选自《21天学通C#》一书 下面来实现一个简易的注册表编辑器。它具备了Windows操作系统自带的注册表编辑器的一般功能。如示例代码19-7所示。示例代码19-7主窗体。主窗体在启动时&#xff0c;会在加载事件中加载注册表到树形控件中&#xff0c;就像在Windows操作系统中…

世博游览技巧

世博游览技巧 方案一&#xff1a; 一日进园 步骤1&#xff1a;4:50-5:30到达5号门3号口 07:00开园后最大速度向后面的安检口跑 看到少于30人就可以拿到中国的预约&#xff08;也就是安检的前3排&#xff09; 09:00安检后就会有人发中国的预约券&#xff08;可以不按预约的时间…

node 16位 转24位_同时将24位和32位BMP图像顺时针旋转90度

上一次我们将24位的皮卡丘旋转了90度&#xff0c;但是后来改需求了。。。要求把32位的.bmp文件也能够旋转90度。上次就懵逼的我继续懵逼&#xff0c;只好继续转向CSDN求助。浏览了各种求助帖&#xff08;还找到了数年前的信科大一学长&#xff09;&#xff0c;终于发现了32位和…