杨中科 .netcore 依赖注入

1.概念

概念

生活中的“控制反转”:自己发电和用电网的电。
依赖注入(Dependency Injection,Dl)是控制反转:(Inversion of Control,l0c)思想的实现方式。
依赖注入简化模块的组装过程,降低模块之间的耦合度

自己发电的代码

var connSettings =ConfigurationManager.ConnectionStrings["connstr1"];
string connStr= connsettings.ConnectionString;
SqlConnection conn = new SqlConnection(connstr);

缺点是?
你需要对一切流程很清楚。

代码控制反转的目的

'怎样创建XX对象”---->“我要XX对象

两种实现方式:
1)服务定位器(ServiceLocator);
2)依赖注入(Dependency Injection,Dl);

畅想Demo

服务定位器
IDbConnection conn=ServiceLocator.GetService();

依赖注入

class Demo
{
	// 创建对象之后,框架自动为他赋值
	public lDbConnection Conn { get; set; }
	public void insertDB()
	{
		IDbCommand cmd= Conn.CreateCommand();
	}
	
}

第二部分 依赖注入

DI几个概念

服务(service):对象;
注册服务:服务容器:负责管理注册的服务;
查询服务:创建对象及关联对象;
对象生命周期:Transient(瞬态,每次获取都是一个新的对象);scoped(范围,在这个范围之内,每次都是同一个对象);singleton(单例,无论谁获取这个服务,都是同一个对象);

.NET 中使用DI

1、测试代码见备注
2、根据类型来获取和注册服务可以分别指定服务类型(servicetype)和实现类型(implementationtype)。这两者可能相同,也可能不同。服务类型可以是类,也可以是接口建议面向接口编程,更灵活。
3、.NET控制反转组件取名为DependencyInjection但它包含ServiceLocator的功能。

功能测试类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
调用:
在这里插入图片描述
运行结果:

在这里插入图片描述

.NET 中使用DI 2

1、Install-Package Microsoft.Extensions.DependencyInjection
2、using Microsoft.Extensions.DependencyInjection
3、ServiceCollection用来构造容器对象IServiceProvider。调用ServiceCollection的BuildserviceProvider()创建的ServiceProvider,可以用来获取BuildserviceProvider()之前Servicecollection中的对象。示例代码见备注。

示例

1.安装nuget 包
在这里插入图片描述

2、引入包

在这里插入图片描述

3、构造容器对象
在这里插入图片描述
目前看起来 没有任何意义
一行new 就搞定的代码!! 写了八行

第三部分,依赖注入

生命周期

1、给类构造函数中打印,看看不同生命周期的对象创建使用serviceProvider.CreateScope()创建Scope.
2、如果一个类实现了IDisposable接口,则离开作用域之后容器会自动调用对象的Dispose方法,
3、不要在长生命周期的对象中引用比它短的生命周期的对象。在ASP.NET Core中,这样做默认会抛异常。
4、生命周期的选择:如果类无状态,建议为singleton;如果类有状态,且有Scope控制,建议为Scoped,因为通常这种Scope控制下的代码都是运行在同一个线程中的,没有并发修改的问题;在使用Transient的时候要谨慎。
5、.NET注册服务的重载方法很多,看着文档琢磨吧

测试生命周期

AddTransient 模式

在这里插入图片描述
运行结果:
在这里插入图片描述

测试2
在这里插入图片描述
运行结果:
在这里插入图片描述

证明,每次调用GetService 都会返回一个新的对象

AddSingleton 模式

在这里插入图片描述

运行结果:
在这里插入图片描述

AddScope模式

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
表明为同一个对象

再次创建一个Scope

在这里插入图片描述
运行结果:
在这里插入图片描述

不同Scope 中 进行对比

在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述
不同范围内拿到的对象不是同一个

没有成员变量 ,没有属性 :无状态类。 建议为Singleton,单线程不考虑并发问题。

如果类有状态,且有Scope控制,建议为Scope,通常Scope 控制的代码。都是运行在同一个线程内的。

Transient 需要谨慎,比较耗费内存

服务定位器

其他注册方法:

服务类型和实现类型不一致的注册
简单看看其他Add*方法

方式一

在这里插入图片描述
运行结果:
在这里插入图片描述

方式二
在这里插入图片描述

结果完全相同

单例方式:
在这里插入图片描述

IServiceProvider的服务定位器方法:

T GetService()如果获取不到对象,则返回null。
object GetService(Type serviceType)
T GetRequiredservice()如果获取不到对象,则抛异常
object GetRequiredservice(Type serviceType)
lEnumerableGetServices()适用于可能有很多满足条件的服务
lEnumerableGetServices(Type serviceType)

示例:
T GetService()

在这里插入图片描述
object GetService(Type serviceType)
在这里插入图片描述

object GetRequiredservice(Type serviceType)
在这里插入图片描述
lEnumerableGetServices()
在这里插入图片描述
目前来说只有一个
在这里插入图片描述

改为实现类:
在这里插入图片描述

未满足,结果为空
在这里插入图片描述
注册多个服务
在这里插入图片描述
因为还有另外一个实现类:
在这里插入图片描述
运行
在这里插入图片描述
结果:
在这里插入图片描述
此时两个服务都将打印

注册多个服务后,再打印结果会发生什么情况呢
在这里插入图片描述
此时是以最后一个为准
使用getrequiredService 也是相同结果

第四部分

DI魅力渐显:依赖注入

1、依赖注入是有“传染性”的,如果一个类的对象是通过DI创建的,那么这个类的构造函数中声明的所有服务类型的参数都会被DI赋值;但是如果一个对象是程序员手动创建的,那么这个对象就和DI没有关系,它的构造函数中声明的服务类型参数就不会被自动赋值。
2、.NET的DI默认是构造函数注入。
3、举例:编写一个类,连接数据库做插入操作,并且记录日志(模拟的输出),把Dao、日志都放入单独的服务类。connstr见备注。

新建项目,演示依赖注入的“传染性”
在这里插入图片描述
装包
在这里插入图片描述

编写代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
controller方法中 中使用
在这里插入图片描述
调用
在这里插入图片描述
运行结果:
在这里插入图片描述
好处,当我们更改实现类时,不需要更改代码
新增从数据库读取配置

在这里插入图片描述
此时只需要更改代码配置
在这里插入图片描述

降低模块之间的耦合
在这里插入图片描述

运行结果:
在这里插入图片描述

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

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

相关文章

Peter算法小课堂—哈希与哈希表

额……字符串我们是第一次学,给大家铺一些基础的不能再基础的基础, 字符串比较大小 字符串大小的比较,不是以字符串的长度直接决定,而是从最左边第一个字符开始比较,大者为大,小者为小,若相等…

HTTP缓存技术

大家好我是苏麟 , 今天说说HTTP缓存技术 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP缓存技术 HTTP 缓存有哪些实现方式? 对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响…

OpenHarmony—UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,…

OS设备管理

设备管理 操作系统作为系统资源的管理者,其提供的功能有:处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。 I/O设备 I/O即输入/输出。I/O设备即可以将数据输入到计算机,或者可以接收…

【华为数通HCIP | 网络工程师】H12-831刷题日记 题目+解析(2)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

2007-2021年上市公司内控信息披露指数/上市公司内部控制信息披露指数数据

2007-2021年上市公司内控信息披露指数/上市公司内部控制信息披露指数数据 1、时间:2007-2021年 2、范围:上市公司 3、指标:证券代码、证券简称、辖区、证监会行业、申万行业、内部环境、风险评估、控制活动、信息与沟通、内部监督、内部控…

软考28-上午题-哈希表和堆

一、哈希表 将关键字作为自变量,使用哈希函数H(key),得到该记录的存储地址。 这一映射过程,称为哈希造表、散列;所得的存储位置 哈希地址、散列地址。 1-1、冲突的定义 两个关键字K1和K2,K1 ! K2,&…

行测线上考试答案查找?推荐你使用这七个公众号和工具 #学习方法#经验分享

合理利用学习辅助工具和资料,可以帮助大学生更好地组织学习内容、掌握知识点和提升学术水平。 1.快解题 这是一个网站 是一款服务于职业考证的考试搜题软件,拥有几千万不同考试医学考试题库和执业医师试题库,通过章节练习,模拟试题,历年真题等练习来让不同的用户…

BLDC驱动刹车电路、能量泄放电路

不同STM32的性能; APM2.8飞控整合资料: APM2.8飞控说明书 GitBook BLDC的制动首先要考虑MOS的泄放电阻的选择,参考前面博客。 刹车电阻制动: 如图所示就是一种通过功率电阻耗散电机制动过程中产生电能的电路。因为功率电阻在这个电路中起…

开什么店最稳定轻松?适合一个人开的实体店推荐

在创业的道路上,很多人都希望找到一种稳定轻松的开店方式。 作为一名资深的鲜奶吧创业者,我将分享我的经验和见解,希望能给那些想开实体店的朋友们一些启示!! 我开鲜奶吧已经有 5 年时间了,目前经营的是鲜…

Leetcode-103. 二叉树的锯齿形层序遍历

这个年和树过不去啦啦啦! 题目: 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1&…

C#入门及进阶|数组和集合(六):集合概述

1.集合概述 数组是一组具有相同名称和类型的变量集合,但是数组初始化后就不便于再改变其大小,不能实现在程序中动态添加和删除数组元素,使数组的使用具有很多局限性。集合能解决数组存在的这个问题,下面我们来学习介绍集合…

TCP_IP(6)

网络层 在复杂的网络环境中确定一个合适的路径. IP协议 与TCP协议并列,都是网络体系中最核心的协议. 基本概念 主机:配有IP地址,但是不进行路由控制的设备; 路由器:即配有IP地址,又能进行路由控制; 节点:主机和路由器的统称; 协议头格式 4位版本号(version):指定IP协议的版…

红队笔记Day2 -->上线不出网机器

今天就来讲一下在企业攻防中如何上线不出网的机器!! 1.基本网络拓扑 基本的网络拓扑就是这样 以下是对应得的P信息,其中的52网段充当一个内网的网段,而111充当公网网段 先ping一下,确保外网ping不通内网,内…

threejs之使用shader实现雷达扫描

varying vec2 vUv; uniform vec3 uColor; uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle)); }void main(){vec2 newUv rotate2d(uTime*6.18)*(vUv-0.5);float angle atan(newUv.x,newUv.y);// 根据uv坐标获…

C语言学习day15:数组定义的格式

数组的写法格式有很多种 int arr1[6] { 1,2,3,4,5,6 }; int arr[] { 1,2,3,4,5,6 }; int arr[10] { 1,2,3,4,5 }; int arr[10]; arr[0] 1; 这些都有差别 代码: int main() {//int arr1[6] { 1,2,3,4,5,6 };//int arr[] { 1,2,3,4,5,6 };//int arr[10]…

【计算机网络】物理层|传输介质|物理层设备|宽带接入技术

目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型​编辑 三、物理层设备 1.物理层设备:中继器&集线器 2.宽带接入技术(有线) ​编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…

如何利用SpringSecurity进行认证与授权

目录 一、SpringSecurity简介 1.1 入门Demo 二、认证 ​编辑 2.1 SpringSecurity完整流程 2.2 认证流程详解 2.3 自定义认证实现 2.3.1 数据库校验用户 2.3.2 密码加密存储 2.3.3 登录接口实现 2.3.4 认证过滤器 2.3.5 退出登录 三、授权 3.1 权限系统作用 3.2 授…

猫头虎分享已解决Bug || AttributeError: ‘str‘ object has no attribute ‘decode‘

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Packet Tracer - Configuring ASA Basic Settings and Firewall Using CLI

Packet Tracer - 使用CLI配置ASA基本设置和防火墙 IP地址表 目标 验证连接并探索ASA设备使用CLI配置ASA的基本设置和接口安全级别使用CLI配置路由、地址转换和检查策略配置DHCP、AAA和SSH服务配置DMZ区域、静态NAT和访问控制列表(ACL) 场景 您的公司…