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.mzph.cn/news/124409.shtml

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

相关文章

Hudi系列文章7-RFC24 Flink 写入流程优化

文章目录 前言问题背景瓶颈与解决方案瓶颈一解决方法工作流程&#xff1a;精准一次语义容灾CoorinatorCheckpoint如何配合使用StreamWriteOperatorCoordinator CheckpointedFunctionStreamWriteFunctionInstant 提前生成问题 瓶颈二问题解决方案BucketAssignerBucketWriter 重点…

Java自学者怎么写简历?

Java自学者怎么写简历&#xff1f; 首先&#xff0c;有技术实力的人绝对不会问这个问题。虽然你是自学的&#xff0c;但是一定要有项目&#xff01;没有项目都是空谈。最近很多小伙伴找我&#xff0c;说想要一些Java资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜…

中间件安全-CVE 复现K8sDockerJettyWebsphere漏洞复现

目录 服务攻防-中间件安全&CVE 复现&K8s&Docker&Jetty&Websphere中间件-K8s中间件-Jetty漏洞复现CVE-2021-28164-路径信息泄露漏洞CVE-2021-28169双重解码信息泄露漏洞CVE-2021-34429路径信息泄露漏洞 中间件-Docker漏洞复现守护程序 API 未经授权访问漏洞…

个人服务器怎么搭建?个人服务器搭建方法

​  个人服务器是指一台由个人拥有和管理的服务器&#xff0c;用于存储和提供个人网站、应用程序或其他在线服务。搭建个人服务器可以让我们更好地掌控自己的数据和网络资源。下面介绍一种常见的个人服务器搭建方法。 第一步&#xff1a;选择合适的硬件 我们需要选择一台适合…

Sketch mac 98.3(矢量绘图设计软件)

Sketch是一款专为Mac设计的矢量图形编辑软件&#xff0c;被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能&#xff0c;包括绘图、图形设计、排版等&#xff0c;可以帮助设计师轻松地创建高质量的矢量图形和模型。Sketch的主要特点包括&#…

Git基础命令实践

文章目录 简介git的安装配置git的安装git的配置 git使用的基本流程创建版本库时光机穿梭版本回退工作区和暂存区管理修改撤销修改删除文件 远程仓库添加远程库从远程库克隆 总结 简介 本文主要记录了我在学习git操作的过程&#xff0c;以及如何使用GitHub。建议先参考廖雪峰的…

测试环境内存溢出排查过程

基本信息 客户名称&#xff1a;xxx 产品名称&#xff1a; 版本号&#xff1a; 问题分类&#xff1a;编码问题 环境类型&#xff1a;实体机 问题现象 保险公司测试环境爆内存&#xff0c;机器挂掉。总共64g的内存&#xff0c;在没有开始测试tomcat部署war包前内存使用率为25%左…

提升管理文件效率:批量删除文件名中的特殊符号

在文件管理的过程中&#xff0c;我们经常会遇到文件名中包含特殊符号的情况&#xff0c;这些符号可能会干扰文件的正常运行&#xff0c;特别是在一些特定的软件或系统中。因此&#xff0c;为了提高文件管理的效率和文件的可读性、可操作性&#xff0c;我们需要对这些特殊符号进…

[BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn

再补完这个就基本上完了. crypto RSA Variation II Schmidt-Samoa密码系统看上去很像RSA,其中Npqq, 给的eN给了d from secret import flag from Crypto.Util.number import *p getPrime(1024) q getPrime(1024)N p*p*qd inverse(N, (p-1)*(q-1)//GCD(p-1, q-1))m bytes…

Web3 治理实践探讨:如何寻找多元化发展路径?

Web3 领域变革正崭露头角&#xff0c;而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径&#xff0c;究竟是治理模型的精进成为首要问题&#xff0c;还是吸纳更多资金与组织教育培训&#xff0c;让开发者成为项目建设的中坚力量&#xff1f;本期 TinTinW…

Panda3d 介绍

Panda3d 介绍 文章目录 Panda3d 介绍Panda3d 的安装Panda3d 的坐标系统介绍Panda3d 的运行Panda3d 加载一个熊猫父节点和子节点之间的关系 验证Panda3d 的坐标系统X 轴的平移Y 轴的平移Z 轴的平移X 轴的旋转Y 轴的旋转Z 轴的旋转 Panda3D是一个3D引擎:一个用于3D渲染和游戏开发…

Docker Consul概述及构建

Docker Consul概述及构建 一、Consul概述1.1、什么是Consul1.2、consul 容器服务更新与发现1.3、服务注册与发现的含义1.4、consul-template概述1.5、registrator的作用 二、consul部署2.1、环境配置2.2、在主节点上部署consul2.3 、配置容器服务自动加入nginx集群2.3.1、安装G…

IDEA 使用技巧

文章目录 语言支持简化编写 有问题&#xff0c;可暂时跳过 个人常用快捷键插件主题插件功能插件 碰到过的问题 除了一些在Linux上用vim开发的大佬&#xff0c;idea算是很友好的集成开发工具了&#xff0c;功能全面&#xff0c;使用也很广泛。 记录一下我的 IDEA 使用技巧&#…

OSPF综合实验

一、实验拓扑 二、实验需求 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&a…

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

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

DVWA-SQL Injection SQL注入

概念 SQL注入&#xff0c;是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中&#xff0c;从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据&#xff08;插入/更新/删除&#xff09;、对数据…

使用Gateway解决跨域问题时配置文件不生效的情况之一

首先html文件只有一个发送ajax请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

21.12 Python 实现网站服务器

Web服务器本质上是一个提供Web服务的应用程序&#xff0c;运行在服务器上&#xff0c;用于处理HTTP请求和响应。它接收来自客户端&#xff08;通常是浏览器&#xff09;的HTTP请求&#xff0c;根据请求的URL、参数等信息生成HTTP响应&#xff0c;并将响应返回给客户端&#xff…

基于SpringBoot的在线笔记系统

技术介绍 &#x1f525;采用技术&#xff1a;SpringSpringMVCMyBatisJSPMaven &#x1f525;开发语言&#xff1a;Java &#x1f525;JDK版本&#xff1a;JDK1.8 &#x1f525;服务器&#xff1a;tomcat &#x1f525;数据库&#xff1a;mysql &#x1f525;数据库开发工具&…

C#开发DLL,CAPL调用(CAPL>> .NET DLL)

文章目录 展示说明新建类库工程C# 代码生成dllCAPL脚本调用dll,输出结果展示 ret为dll里函数返回的值。 说明 新建类库工程 在visual studio中建立。 C# 代码 using