杨中科 .netcore 依赖注入

news/2024/5/19 20:57:20 标签: .netcore, c#

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

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

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

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


http://www.niftyadmin.cn/n/5383351.html

相关文章

GO框架基础 (二)、sqlx库

在 Go 语言中,sqlx 包是一个用于数据库操作的库,它建立在标准库的 database/sql 包之上,并提供了一些额外的功能,以简化和增强与数据库的交互。sqlx 的目标是通过提供更方便的 API 和一些附加功能来改善在 Go 中进行 SQL 数据库查…

【GO语言卵细胞级别教程】06.GO语言的字符串操作

【GO语言卵细胞级别教程】06.GO语言的字符串操作 温馨提示: 本文中使用的项目模块均是 【05.项目创建和函数讲解】 中创建的,具体如何创建项目,请参考 【GO语言卵细胞级别教程】05.项目创建和函数讲解 目录: 【GO语言卵细胞级别…

Android widget基础指南

widget的概念最早是由一名叫Rose的苹果工程师提出,后来经过多方面机缘巧合的发展下,便有了今天Android平台上的小组件widget,一般APP开发可能应用场景较少,最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学&#xf…

深入理解C语言中的联合体(union)

在C语言中,联合体(union)是一种特殊的数据类型,它可以让你在相同的内存位置存储不同的数据类型。通过联合体,你可以在同一时间访问不同的变量,这在某些情况下非常有用。下面我们将深入探讨联合体的特性和用…

rsa公钥的两种形式

rsa 公钥两种形式 1、pem格式文件 或者 base64的 public key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApfNDz78E4qnU23PeE3lQ DYaW9AtniNMWNn51eMANFtiFj6yvpAoejstkC4u0PevoA9YrhPUC97f8xd5Jss2 INyynKH3okVS4at5lxBBdpoqR3LxLSQPRcmh5h19P…

低代码开发与网络信息安全:构建高效防护体系

随着数字化转型的加速,越来越多的企业开始关注低代码开发平台,以提高软件开发效率,缩短上市时间。然而,随之而来的网络信息安全问题也日益严峻。如何在享受低代码开发带来的便捷与高效的同时,确保网络信息安全成为企业…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

阿里云上关于EDAS发布方式

1. 描述蓝绿部署和灰度发布的区别以及适用场景。 蓝绿部署和灰度发布是两种常见的软件发布策略,它们各有特点并适用于不同的场景。 蓝绿部署的特点: 目的:蓝绿部署的主要目的是减少发布时的中断时间,并且能够在新版本出现问题时…