杨中科 .netcore 依赖注入

这篇具有很好参考价值的文章主要介绍了杨中科 .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的功能。

功能测试类

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
调用:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

.NET 中使用DI 2

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

示例

1.安装nuget 包
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

2、引入包

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

3、构造容器对象
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
目前看起来 没有任何意义
一行new 就搞定的代码!! 写了八行

第三部分,依赖注入

生命周期

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

测试生命周期

AddTransient 模式

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

测试2
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

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

AddSingleton 模式

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

AddScope模式

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
表明为同一个对象

再次创建一个Scope

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

不同Scope 中 进行对比

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
不同范围内拿到的对象不是同一个

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

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

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

服务定位器

其他注册方法:

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

方式一

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

方式二
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

结果完全相同

单例方式:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

IServiceProvider的服务定位器方法:

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

示例:
T GetService()

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
object GetService(Type serviceType)
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

object GetRequiredservice(Type serviceType)
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
lEnumerableGetServices()
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
目前来说只有一个
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

改为实现类:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

未满足,结果为空
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
注册多个服务
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
因为还有另外一个实现类:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
此时两个服务都将打印

注册多个服务后,再打印结果会发生什么情况呢
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
此时是以最后一个为准
使用getrequiredService 也是相同结果

第四部分

DI魅力渐显:依赖注入

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

新建项目,演示依赖注入的“传染性”
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
装包
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

编写代码
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
controller方法中 中使用
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
调用
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
好处,当我们更改实现类时,不需要更改代码
新增从数据库读取配置

杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#
此时只需要更改代码配置
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

降低模块之间的耦合
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#

运行结果:
杨中科 .netcore 依赖注入,ASP.NET,.netcore,c#文章来源地址https://www.toymoban.com/news/detail-831413.html

到了这里,关于杨中科 .netcore 依赖注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • netCore使用依赖注入

    依赖注入是一种常用的设计模式,用于解耦组件之间的依赖关系。通过依赖注入,我们可以将一个组件所依赖的其他组件的创建和管理工作交给容器来完成,从而实现组件之间的解耦和灵活性 .NET Core提供了内置的依赖注入容器,使我们能够轻松地实现依赖注入。下面是使用依

    2024年02月16日
    浏览(35)
  • 【NetCore】03-依赖注入

    管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 依赖注入框架提供了对象创建和生命周期管理的核心能力,各个组件相互协作,也是由依赖注入框架的能力来实现的 组件包 Microsoft.Extensions.DependencyInjection.Abstractions Microsoft.Extensions.

    2024年02月15日
    浏览(40)
  • .netcore grpc客户端工厂及依赖注入使用

    gRPC 与  HttpClientFactory  的集成提供了一种创建 gRPC 客户端的集中方式。 可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入 AddGrpcClient函数提供了许多配置项用于处理一些其他事项;例如AOP、重试策略等 创建一个WPF客户端 在App.xaml.cs代码类里重写OnStartup方

    2024年02月12日
    浏览(36)
  • 杨中科 ASP.NET DI综合案例

    1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明:案例中开发了自己的日志、配置等

    2024年02月21日
    浏览(33)
  • ASP .net core微服务实战(杨中科)

    背景: 主要是思考下,我们为什么要用微服务? 微服务我现在理解是:提供了我们一种模块化的手段,一个服务负责一种类型的业务,是一种面对复杂问题进行拆分的方式,但是也会引入一些中间件,让本来可能简单的东西,变的复杂一些,因为:有了拆分就必须有治理。

    2024年01月20日
    浏览(44)
  • 杨中科 ASP.NET Core前后端分离开发

    前后端分离 1、传统MVC开发模式: 前后端的代码被放到同一个项目中,前端人员负责编写页面的模板,而后端开发人员负责编写控制器和模型的代码并且“套模板”。 缺点: 互相依赖, 耦合性强,责任划分不清 。 2、主流的“前后端分离”: 前端开发人员和后端开发人员分别负

    2024年01月23日
    浏览(53)
  • .NET Core 依赖注入

    在.NET Core中,依赖注入(Dependency Injection,简称DI)是框架的一个重要特性,可以帮助我们解耦代码、管理对象生命周期以及提高可测试性等.一下是.NET Core中依赖注入的一些基本概念和用法: 1、服务(Service):在DI中,服务即一个对象或者类型。用于完成特定的功能.例如,数据库访

    2023年04月24日
    浏览(45)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(45)
  • .Net依赖注入神器Scrutor(上)

    从.Net Core 开始,.Net 平台内置了一个轻量,易用的 IOC 的框架,供我们在应用程序中使用,社区内还有很多强大的第三方的依赖注入框架如: Autofac DryIOC Grace LightInject Lamar Stashbox Simple Injector 内置的依赖注入容器基本可以满足大多数应用的需求,除非你需要的特定功能不受它支

    2024年03月19日
    浏览(45)
  • .NET 通过源码深究依赖注入原理

    依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。 Singleton服务为什么不能依赖Scoped服务? 多个构造函数的选择机制? 源码是如何识别循环

    2024年02月05日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包