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.hqwc.cn/news/154785.html

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

相关文章

java解决修改图片尺寸,压缩图片后出现背景变黑,图片字体模糊问题

将以下数学公式的图片使用Hutool提供的图片工具类改变尺寸 代码如下: package com.jason.common.file.word;import cn.hutool.core.img.ImgUtil; import cn.hutool.core.io.FileUtil;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage;…

同城门户同城分类信息网站源码discuz插件+pc端+小程序端+49款插件

同城分类信息 同城好店 同城合伙人 同城招聘 同城卡 同城活动 同城优惠抢购 同城商城 同城头条 同城抽奖 同城拼团 同城砍价 同城电话本 同城认证 同城签到 同城拼车 同城红包 同城子站点 同城相亲 同城交友 同城小程序 代码逻辑清晰,文件规划统一明了&#xff0c;非常不错的&…

Matlab中的app设计

1.窗口焦点问题&#xff1a; 窗口焦点问题&#xff1a;确保你的应用程序窗口正常处于焦点状态。有时&#xff0c;其他窗口的弹出或焦点切换可能导致应用程序最小化。点击应用程序窗口以确保它处于焦点状态。 窗口管理&#xff1a;确保你的 MATLAB 或操作系统没有未处理的错误或…

中文编程工具免费版下载,中文开发语言工具免费版下载

中文编程工具免费版下载&#xff0c;中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502

Java访问直接内存

一、背景 上一篇文章 类目体系设计总结&#xff0c;讲了Forest缓存数据是放在直接内存的&#xff0c;今天我们就来了解一下Java的直接内存是个啥玩意&#xff0c;它该怎么使用。 二、直接内存介绍 直接内存是在Java堆外的&#xff0c;直接向系统申请内存空间&#xff0c;它不…

js实现groupby

初始结果是一个数组&#xff0c;最终得到一个对象。 let arr [{sex: male,name: xiaomi }, {sex: male,name: lisi }, {sex: female,name: zhangsan }]最终得到&#xff1a; 代码&#xff1a; const groupBy (list, key) > {const obj {};list.map(item > {if (!ob…

回归算法|长短期记忆网络LSTM及其优化实现

本期文章将介绍LSTM的原理及其优化实现 序列数据有一个特点&#xff0c;即“没有曾经的过去则不存在当前的现状”&#xff0c;这类数据以时间为纽带&#xff0c;将无数个历史事件串联&#xff0c;构成了当前状态&#xff0c;这种时间构筑起来的事件前后依赖关系称其为时间依赖&…

安防视频监控平台EasyCVR前端解码与后端解码的区别介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理&#xff0c;支持多类型设备、多协议方式接入&#xff0c;具体包括&#xff1a;国标GB28181协议、RTMP、RTSP/Onvif、海康Ehome&#xff0c;以及海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石SDK等&#x…

“破解我!“---160个CrackMe练习002-Afkayas.1.Exe

文章目录 前言题目分析程序分析Keygen 前言 系列之002&#xff0c;记录学习。 题目分析 一道一星的题目 惯例查壳。 32-bit的文件&#xff0c;用的是 VB 写的。 关于Visual Basic&#xff1a; Visual Basic&#xff08;VB&#xff09;是由微软公司开发的包含环境的事件驱动…

[C++]命名空间等——喵喵要吃C嘎嘎

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

如何用思维导图开会

在办公室和会议室使用思维导图会有无数好处。今天我们就聊聊思维导图在开会中的作用&#xff1f; 为什么要在会议中使用思维导图&#xff1f; 思维导图可以帮助我们整理思路。会议通常涉及到复杂的议题和讨论&#xff0c;使用思维导图可以帮助整合和梳理参与者的思路和观点。通…

5000元高端投影仪双十一怎么选?极米H6 4K高亮定焦版成为首选

随着人们对生活品质越来越高的追求&#xff0c;更多的年轻人开始选择以投影仪取代传统电视。但当下国内外市场上的投影仪品牌和型号众多&#xff0c;如果预算在5000元左右&#xff0c;应该选择哪一款投影仪呢&#xff1f;大家如果不知如何选择&#xff0c;不妨试试极米科技近期…