ASP.NET Core--依赖注入

news/2024/5/17 8:34:49/文章来源:https://blog.csdn.net/huan13479195089/article/details/127168789

文章目录

  • 依赖注入
    • 什么是依赖注入
      • 什么是依赖
      • 什么是注入
    • 依赖注入解决的问题
    • .Net Core DI
    • 替换默认服务容器

依赖注入

什么是依赖注入

什么是依赖

Rely类

public class Rely
{public Task Test(string testMessage){Console.WriteLine(testMessage);return Task.FromResult(0);}
}

Output类

public class Output
{Rely rely = new Rely();public async Task Out(){await rely.Test("這是一個測試消息");}
}

Output类需要Rely类来帮助它实现输出的功能,这样Output类对Rely类产生了依赖,可以理解为Output依赖于Rely

依赖的一个设计原则:依赖于抽象,而不是具体的实现,这个后面会具体解释的

什么是注入

修改Output类

public class Output
{private Rely _rely;public Output(Rely rely){_rely = rely;}public async Task Out(){await _rely.Test("這是一個測試消息");}
}

在这里Output类不去实例化Rely类,而是通过其他人传递给我,我只用就好。到底怎么理解注入呢?

简单来说就是别人对依赖创建实例化,我自己只负责使用,别人创建好了给我使用,这么一个过程可以理解为注入

这里主要体现了控制反转 (IoC)的思想,什么是IOC ?我们看看下面的图就好理解了
在这里插入图片描述
直接依赖关系在运行的时候A调用B,B调用C,编译的时候A取决于B,B取决于C。

而在反转依赖关系中, A可以调用B实现的抽象上的方法,让A可以在运行时调用B,而B又在编译时依赖于A控制的接口,程序运行时流程跟直接依赖关系一样。但是插入了接口意味着可以轻松的有不同实现

依赖注入解决的问题

依赖注入主要体现了IOC思想,IOC将实现详细信息编写为依赖并且实现了更高级的抽象,因此程序测试性,维护性,模块化程度都更高了。这也就对应了刚刚的那个设计规则–依赖于抽象,而不是具体的实现。

那么依赖注入到底解决了哪些问题呢?

问题一:在直接依赖关系中如果A类需要更换为其他实现,那么就必须得修改B类

问题二:如果有多个依赖B类的类,那么将会实例化多个配置,这样代码会比较分散和冗余

问题三:这种实现方法很难实现单元测试

解决这些问题的办法:

一:使用了接口抽象话依赖关系的实现,改动实现只需要改动注入的地方即可

二:注册服务容器中的依赖关系,有多处需要不许多出实例化配置,直接在Startup.ConfigureServices中注册即可

.Net Core DI

在.NET Core中DI的核心分为两个组件:IServiceCollection和IServiceProvider。
IServiceCollection—负责注册
IServiceProvider—负责提供实例

在Startup.cs中ConfigureServices中注册服务

 public void ConfigureServices(IServiceCollection services){services.Configure<CookiePolicyOptions>(options =>{options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;});services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//单例生存期services.AddScoped<IHttpContextAccessor, HttpContextAccessor>();//范围生存期services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();//暂时生存期          services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);}

1、 Transient(暂时生存期)–暂时生存期服务是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。

暂时生存期会在每次请求的时候创建一个实例

2、 Scoped(范围生存期)–范围生存期服务是每个客户端连接时创建的一次实例

范围生存期会在客户端连接时创建一次实例,然后每次请求的实例都是相同的

3、 Singleton(单例生存期)–单例生存期会在程序第一次请求是创建一次实例

单例生存期仅会在第一次连接时创建一次实例,所有整个程序使用的实例都是同一个实例

替换默认服务容器

1、 为什么替换默认服务容器

我们可以首先理解下什么是服务容器—依赖注入把依赖的创建给了别人,别人创建好了再给我们使用。那么在哪里创建依赖呢?或者说在那里管理依赖呢?这里就有了容器这个概念,负责管理系统中所有的依赖。

那么我们为什么要替换容器呢?

内置的服务容器足够实现一些小型的项目或满足大多数的消费者,但是遇到大型的项目就比较麻烦了,依赖较多,内置的服务容器就显得有点短板了。当我们遇到这些问题的时候就可以考虑替换默认服务容器。

2、 如何替换服务容器

这里我们说下替换服务容器为Autofac。
安装适当的包
Autofac
Autofac.Extensions.DependencyInjection
在 Startup.ConfigureServices 中配置返回 为IServiceProvider:

public IServiceProvider ConfigureServices(IServiceCollection services)
{services.AddMvc();var containerBuilder = new ContainerBuilder();containerBuilder.RegisterModule<DefaultModule>();containerBuilder.Populate(services);var container = containerBuilder.Build();return new AutofacServiceProvider(container);
}

如果要使用第三方容器的话, Startup.ConfigureServices 必须返回 IServiceProvider。

然后我们在 DefaultModule 中配置 Autofac

public class DefaultModule : Module
{protected override void Load(ContainerBuilder builder){      builder.RegisterType<CharacterRepository>().As<ICharacterRepository>();}
}

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

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

相关文章

【QT学习】如何绘制圆角窗口?

文章目录前言一、实现效果二、基础知识1.QBitmap类2.QPainter类3.setMask函数三、实现代码总结前言 在使用QT创建窗口时&#xff0c;所创建出来的默认窗口都是矩形的。当我们隐藏默认标题栏&#xff0c;想自己绘制自定义的标题栏时&#xff0c;就会发现矩形的窗口过于棱角分明。…

加深印象篇之Servlet

环境配置 需要配置web.xml文件,如图所示: userServlet:是指那个继承自HttpServlet的.java文件的名称 index.jsp:是指那个随意一个.jsp文件名称即可 要使用到Servlet相关类,需要提前将相关导包导入到pom.xml文件中 相关文件的编写 1、JDBCUtils.java文件(存储连接数据库的…

(附源码)计算机毕业设计ssm大数据学院图书管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

web前端面试题附答案016-怎么让顶部轮播图渲染的更快?

一、为什么强调轮播图&#xff1f; 很多时候我们强调用户体验&#xff0c;而这里更多时候我们更强调完美的首屏体验&#xff0c;而现在几乎每个网站顶部第一个大模块就是轮播图。轮播图占得区域最大&#xff0c;图片质量也更高&#xff0c;几乎一张图片的面积&#xff0c;体积就…

【C语言】结构体字节对齐

目录 前言 一、什么是字节对齐&#xff1f; 二、结构体字节对齐 三、#pragma pack()的使用 总结 结语 封面 前言 本教程可能会用到一点汇编的知识&#xff0c;看不懂没关系&#xff0c;知道是那个意思就行了。使用的工具是vs2010。 一、什么是字节对齐&#xff1f; 字节…

【易购管理系统】商品列表

我们来写一下商品管理界面 在Goods.vue中 <template><div><!-- 1.搜索区域 --><div class"header"></div><!-- 2.表格区域展示视图数据 --><div class"wrapper"></div><!-- 3.分页 --></div&g…

数据分析3-pandas

文章目录pandaspandas常用数据类型1.Series的创建pandas读取外部数据pandas读取数据库DataFrame基础字典列表排序索引loc与iloc字符串离散化数据的合并pandas pandas常用数据类型 Series一维数据&#xff0c;带标签数组 DataFrame 二维&#xff0c;Series容器 import pandas …

【ElasticSearch】(分组统计,自动补全,数据同步)

分组统计&#xff0c;自动补全&#xff0c;数据同步1.分组统计1-1.聚合为桶1-2.桶内度量2.RestAPI结果条件过滤数据同步安装MQ声明交换机、队列发送MQ消息接收MQ消息搭建集群修改系统配置集群状态监控1.分组统计 桶(bucket): 桶的作用&#xff0c;是按照某种方式对数据进行分…

关苏哲-洞察问题本质,解决工作难题

高效管理者的三大技能 问题界定的6个问题 1.你所需要解决的问题是什么&#xff1f; 2.你为什么需要解决这个问题&#xff1f; 3.你期待的理想结果是什么&#xff1f; 4.这个问题包括哪些子问题&#xff1f; 5.你曾经尝试过哪些解决方式&#xff1f;其他人呢&#xff1f; 6.这个…

(机器学习-深度学习快速入门)第二章数据分析基本工具正则表达式

文章目录一&#xff1a;说明二&#xff1a;正则表达式学习建议三&#xff1a;Python正则表达式简要说明&#xff08;1&#xff09;基本匹配&#xff08;2&#xff09;元字符①&#xff1a;.号②&#xff1a;字符集③&#xff1a;重复次数④&#xff1a;{}号⑤&#xff1a;(...)…

Spring(二)- 工厂高级

八&#xff1a;控制Spring工厂创建对象的次数 为什么要控制对象创建的次数 &#xff1f; 好处&#xff1a;节省不必要的内存浪费 &#xff01; 九&#xff1a;对象的生命周期 1.什么是对象的生命周期 指的是一个对象创建&#xff0c;存活&#xff0c;消亡的一个完整过程 2.…

基于朴素贝叶斯算法对肿瘤类别分类

目录 朴素贝叶斯算法​编辑 朴素贝叶斯的三种方式 实战——肿瘤类别的分类 朴素贝叶斯算法 贝叶斯定理 贝叶斯定理&#xff08;Bayes Theorem&#xff09;也称贝叶斯公式&#xff0c;是关于随机 事件的条件概率的定理 定理内容&#xff1a; 如果随机事件A1 ,A2 ,...,An构成…

【177】Java利用JNI调用C++编写的DLL,连接海康人脸抓拍机,实现人脸库全量更新。

C开发环境&#xff1a;Visual Studio 2022、windows10 Java开发环境&#xff1a;Java8、idea、windows10 这个DLL功能&#xff0c;是输入一个设备IP&#xff0c;删除设备中的所有以前的人员资料&#xff0c;然后用文件夹中XML和图片的新人脸库资料上传到设备的人脸库中。相当于…

【MySql】常用语法及例题

文章目录字符串处理函数/正则rlikegroup_concat组合查询 & 指定选取union all字符串处理函数/正则 rlike 在MySQL中&#xff0c;RLIKE运算符用于确定字符串是否匹配正则表达式。它是REGEXP_LIKE()的同义词。 如果字符串与提供的正则表达式匹配&#xff0c;则结果为1&…

【网安神器篇】——WPScan漏洞扫描工具

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;对于计算机的学习者来说&#xff0c;初期的学习无疑是最迷茫和难以坚持的&#xff0c;中后期主要是经验和能力的提高&#xff0c;我也刚接触计算机1年&#xff0c;也在不断的探索&#xf…

理解递归与循环

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

Matlab论文插图绘制模板第52期—三维分簇散点图(Swarmchart3)

在之前的文章中&#xff0c;分享了Matlab分簇散点图的绘制模板&#xff1a; 抖动控制的分簇散点图&#xff1a; 这一次&#xff0c;再来分享一下三维分簇散点图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用…

Oracle SQL 执行计划

解释计划 语句EXPLAIN PLAN 用来显示优化器为SQL语句选择的执行计划。将估计的信息称为解释计划输出&#xff0c;把实际信息称为执行计划输出。以此区分实际的和预期的执行计划。 使用解释计划 当使用EXPLAIN来为查询生成预期的执行计划时&#xff0c;输出将包括以下几种&…

win10开机黑屏不显示桌面,怎么办

喜欢尝鲜的小伙伴给电脑安装上ghost win10系统&#xff0c;开机发现一直黑屏&#xff0c;总是进不去桌面&#xff0c;但是鼠标却又可以动&#xff0c;关机重启好几次还是一样。 为什么总会这样&#xff1f;可能是启动系统时&#xff0c;加载explorer.exe这个软件时出现异常或是…

什么软件可以让照片动起来?快把这些软件收好

相信有不少小伙伴都有拍过照片吧&#xff0c;每次翻阅以前的照片时&#xff0c;会不会回想起以前拍照时的种种画面场景呢&#xff1f;如果你们想要让这个照片更加生动形象的话&#xff0c;我们还可以把它做成动态的照片&#xff0c;只需要使用一些软件的功能即可。那你们知道怎…