C# “依赖注入” 中的 “三种生命周期”

🚀简介

依赖注入(Dependency Injection,简称DI)是一种实现控制反转(IoC)的技术,用于减少代码之间的耦合度。通过依赖注入,一个类可以从外部获取其依赖的对象,而不是自己创建。这样可以使得代码更加模块化,更易于测试和维护。

🐳依赖注入的生命周期主要有以下三种:

  1. Transient:每次请求都会创建一个新的实例。这是最常见的生命周期选项。
  2. Scoped:在同一次请求中始终返回同一实例。如果在不同的请求中,将会创建一个新的实例。
  3. Singleton:每次请求都返回同一个实例,即在首次请求时创建的实例。

🚀安装NuGet包

首先,我们先安装 Microsoft.Extensions.DependencyInjection:这是Microsoft提供的依赖注入框架。

🚀Transient

创建一个类,包含一个属性(Name)和一个方法(SayHi)

public class TestServicesImp
{public string Name { get; set; }public void SayHi(){Console.WriteLine("Hello:"+Name);}
}

👻通过ServiceCollection创建了一个服务容器,然后通过AddTransient方法将TestServicesImp类型注册到这个服务容器中。这里使用的是瞬时生命周期,也就是每次从容器中获取TestServicesImp类型时,都会创建一个新的实例。

public class Program
{public static void Main(string[] args){var serviceCollection = new ServiceCollection();serviceCollection.AddTransient<TestServicesImp>();using (ServiceProvider sp = serviceCollection.BuildServiceProvider()){var t1 = sp.GetService<TestServicesImp>();t1.Name = "张三";t1.SayHi();var t2 = sp.GetService<TestServicesImp>();t2.Name = "李四";t2.SayHi();var referenceEquals = object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}
}

运行结果!因为在瞬时生命周期中,每次获取服务都会创建新的实例。 因此通过object.ReferenceEquals方法比较了t1和t2是否是同一个实例,结果会输出false

🚀 Scoped

我们将上面代码中的服务注册AddTransient方法换成AddScoped,然后t2.SayHi();换成t1.SayHi();,再试一次。

    public static void Main(string[] args){var serviceCollection = new ServiceCollection();serviceCollection.AddScoped<TestServicesImp>();using (ServiceProvider sp = serviceCollection.BuildServiceProvider()){var t1 = sp.GetService<TestServicesImp>();t1.Name = "张三";t1.SayHi();var t2 = sp.GetService<TestServicesImp>();t2.Name = "李四";t1.SayHi();var referenceEquals = object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}

发现这次的比较结果为true,并且第二次调用SayHi也是使用t1,但依然输出了李四,因此可以得出,两次获取服务得到的是同一个实例。

 👻我们对代码再进行改造一下,创建一个新的服务作用域,通过这个作用域的ServiceProvider对象获取了另一个TestServicesImp的实例t2。

    public static void Main(string[] args){var serviceCollection = new ServiceCollection();serviceCollection.AddScoped<TestServicesImp>();using (ServiceProvider sp = serviceCollection.BuildServiceProvider()){var t1 = sp.GetService<TestServicesImp>();t1.Name = "张三";using (IServiceScope scope = sp.CreateScope()){var t2 = scope.ServiceProvider.GetService<TestServicesImp>();t2.Name = "李四";t1.SayHi();t2.SayHi();var referenceEquals = object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}}

因为它们是在不同的Scope中获取的,所以这次的结果是false

 

🚀Singleton 

我们将服务注册AddScoped方法,换成AddSingleton,然后再执行一次

    public static void Main(string[] args){var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<TestServicesImp>();using (ServiceProvider sp = serviceCollection.BuildServiceProvider()){var t1 = sp.GetService<TestServicesImp>();t1.Name = "张三";using (IServiceScope scope = sp.CreateScope()){var t2 = scope.ServiceProvider.GetService<TestServicesImp>();t2.Name = "李四";t1.SayHi();t2.SayHi();var referenceEquals = object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}}

在输出结果中很显然可以看出使用AddSingleton注册服务,每次请求都返回同一个实例

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

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

相关文章

评估在线不平衡学习的PAUC

评估在线不平衡学习的PAUC 原始论文《Prequential AUC: properties of the area under the ROC curve for data streams with concept drift》 由于正常的AUC需要计算整体数据集上&#xff0c;每个数据的预测置信度的排名。那么我们首先要求我们的在线学习算法在进行预测时也返…

实体店做商城小程序如何

互联网电商深入各个行业&#xff0c;传统线下店商家无论产品销售还是服务业&#xff0c;仅靠以往的经营模式&#xff0c;很难拓展到客户&#xff0c;老客流失严重&#xff0c;同时渠道单一&#xff0c;无法实现外地客户购物及线上客户赋能等。 入驻第三方平台有优势但也有不足…

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务&#xff0c;有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案&#xff0c;该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 什么是 S…

Java on Azure Tooling 9月更新|Azure OpenAI 服务和 Playground 支持及更多

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 开发者工具九月份更新。在本次更新中&#xff0c;我们将介绍对 Azure OpenAI 服务和 Playground 的支持&#xff0c;开发…

<C++> vector模拟实现

目录 前言 一、定义命名空间 二、构造函数 三、拷贝构造 四、赋值运算符重载 五、push_back && reserve 六、深拷贝问题 七、iterator 迭代器 1. 可读可写 2. 只读 八、operator[ ] 1. 可读可写 2. 只读 九、insert 问题&#xff1a;内部迭代器失效 十、erase 十一、re…

《RT-DETR改进实战》专栏介绍 专栏目录

《RT-DETR改进实战专栏》介绍及目录 介绍&#xff1a;欢迎来到最新专栏《RT-DETR改进实战》&#xff01;这个专栏专注于基于 YOLOv8 项目的魔改版本&#xff0c;而不是百度飞桨框架中的 RT-DETR。 本专栏为想通过改进 RT-DETR 算法发表论文的同学设计。每篇文章均包含完整的改…

探讨下前端测试的常见场景

前端测试 场景 这边指的测试是指白盒测试&#xff0c;用代码来测试代码。 测试有利于提升代码质量。 代码功能和需求一致。根据需求&#xff0c;写测试。测试通过了&#xff0c;则表明需求实现了。保证代码重构后&#xff0c;未改坏以前的功能。代码重构后&#xff0c;能通过…

分类预测 | Matlab实现KOA-CNN-BiGRU-selfAttention多特征分类预测(自注意力机制)

分类预测 | Matlab实现KOA-CNN-BiGRU-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09; 目录 分类预测 | Matlab实现KOA-CNN-BiGRU-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 1.M…

jenkins详细安装教程

这里写目录标题 一、Jenkins安装与部署1-1、Jenkins的简介1-2、下载需要的软件1-2-1 jekins.war1-2-2 tomcat安装方式 1-3、使用11版本的jdk1-4、开启jenkins1-5、获取密码1-5 修改镜像(可改可不改) 二、卸载Jenkins 一、Jenkins安装与部署 1-1、Jenkins的简介 Jenkins是一个…

Java电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现|电商API接口接入

一&#xff1a;token 简介 Token&#xff1a;访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证&#xff0c;减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号&#xff0c;服务器会给出一个appId和一个key, …

mysql 间隙锁

mysql 默认是可重复读的隔离级别&#xff0c;这种默认会有幻读&#xff0c;幻读指的什么现象呢&#xff0c;就是在同一个事物中前后两次查到的结果不一致&#xff0c;那么mysql是怎么解决幻读的呢&#xff0c;这就是mvcc mvcc 什么是mvcc呢&#xff0c;就是多版本并发控制&am…

迁移学习 - 微调

什么是与训练和微调&#xff1f; 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先&#xff0c;你需要随机初始化参数&#xff0c;然后开始训练网络&#xff0c;不断调整参数&#xff0c;直到网络的损失越来越小。在训练的过程中&#xff0c;一开始初始化的参数会…

【Python算法】算法练习(一)

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 目录 1、输出n以内的质数 2、求n以内最大的m个质数的和&#xff0c;并打印这些质数以及它们的和 方法一 方法二…

GaussDB数据库管理系统介绍

1.GaussDB的发展 2.GaussDB的生态 内部&#xff1a; 云化自动化方案。通过数据库运行基础设施的云化将DBA(数据库管理员)和运维人员的日常工作 自动化。外部&#xff1a; 采用与数据库周边生态伙伴对接与认证的生态连接融合方案&#xff0c;解决开发者/DBA难获取、应用难对接等…

2023年【安全员-C证】报名考试及安全员-C证考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证报名考试根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试内容全…

[UDS] --- CommunicationControl 0x28

1 0x28功能描述 根据ISO14119-1标准中所述&#xff0c;诊断服务28服务主要用于网络中的报文发送与接受&#xff0c;比如控制应用报文的发送与接收&#xff0c;又或是控制网络管理报文的发送与接收&#xff0c;以便满足一定场景下的应用需求。 2 0x28应用场景 一般而言&#…

<多线程章节八> 单例模式中的饿汉模式与懒汉模式的讲解,以及懒汉模式中容易引起的Bug

&#x1f490;专栏导读 本篇文章收录于多线程&#xff0c;也欢迎翻阅博主的其他文章&#xff0c;可能也会让你有不一样的收获&#x1f604; &#x1f337;JavaSE &#x1f342;多线程 &#x1f33e;数据结构 文章目录 &#x1f490;专栏导读&#x1f4a1;饿汉模式&#x1f4a1;…

【算法练习Day32】 斐波那契数爬楼梯使用最小花费爬楼梯

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 斐波那契数爬楼梯使用最小花…

Vue的动画与过度

一、Vue的动画效果 &#xff08;一&#xff09;编写CSS关键帧动画 keyframes show{from{transform: translateX(-100%);}to{transform: translateX(0px);} } &#xff08;二&#xff09;定义动画效果 .v-enter-active { animation: 配置项 } // 显示动画 .v-leave-active…

洛谷 P5717 三角形分类 C++代码

目录 前言 题目描述 思路点拨 优化 AC代码 AC截图 结尾 前言 马上就要突破10000浏览量了&#xff0c;再写一篇加加油&#xff01; 图片截图时间:2023.10.25.20:23 题目描述 网址&#xff1a;【深基3.习8】三角形分类 - 洛谷 思路点拨 这道题是给定三条边的长度&#…