依赖注入_生命周期

本文详细介绍了ASP.NET Core中的服务生命周期,包括Transient、Singleton和Scoped三种类型。Transient每次请求都会创建新实例,Singleton在整个应用程序生命周期中只创建一次实例,而Scoped则在同一请求范围内返回相同实例,不同请求拥有独立实例。理解这些生命周期对于正确管理和使用依赖注入至关重要,避免出现并发问题和资源泄漏。
摘要由CSDN通过智能技术生成

目录

一、生命周期

二、三种不同生命周期对象比较

1、AddTransient:瞬时生命周期

2、AddSingleton:单例

3、AddScoped

总结:

三者的区别:


一、生命周期

1、给类构造函数中打印,看看不同生命周期的对象创建使用serviceProvider.CreateScope()创建Scope

2、如果一个类实现了IDisposable接口,则离开作用域之后容器会自动调用对象的Dispose方法。3、不要在长生命周期的对象中引用比它短的生命周期的对象。在ASP.NET Core中,这样做默认会抛异常

4、生命周期的选择:如果类无状态,建议为Singleton;如果类有状态,且有Scope控制,建议为Scoped,因为通常这种Scope控制下的代码都是运行在同一个线程中的,没有并发修改的问题;在使用Transient的时候要谨慎

二、三种不同生命周期对象比较

注意:接口跟实现类这里就不写了 上一篇里边有说明

1、AddTransient:瞬时生命周期

比较一下两个实例是否指向同一个对象

 object.ReferenceEquals(t, t1);//比较两个实例是否来自同一个对象

object里边有个方法ReferenceEquals()用来比较是否为同一对象

输出结果

false

说明不是两个实例不是指向同一个对象

换一种生命周期创建对象

2、AddSingleton:单例

代码:

 输出结果:

true

说明两个实例指向同一个对象 

3、AddScoped

在控制台程序中 范围是由程序员决定的、

在ASP.NET Core范围是由框架来决定的,默认是一次服务器请求是一个Scope

范围是using大括号内

所以结果是true

 

所以下边再建一个对象scope2自然而然结果也是true

 那么想一下在两个范围内分别拿到两个对象 比较一下结果是不是true

代码如下:

结果显而易见是false

总结:

在同一范围内拿到的对象是同一对象

在两个范围内拿到的对象不是同一对象

三者的区别:

AddTransient: 每次service请求都是获得不同的实例,暂时性模式:暂时性对象始终不同,无论是不是同一个请求(同一个请求里的不同服务)同一个客户端,每次都是创建新的实例
AddScoped: 对于同一个请求返回同一个实例,不同的请求返回不同的实例,作用域模式:作用域对象在一个客户端请求中是相同的,但在多个客户端请求中是不同的
AddSingleton: 每次都是获得同一个实例, 单一实例模式:单一实例对象对每个对象和每个请求都是相同的,可以说是不同客户端不同请求都是相同的
说明:

AddSingleton的生命周期

项目启动-项目关闭 相当于静态类 只会有一个

AddScoped的生命周期

请求开始-请求结束 在这次请求中获取的对象都是同一个

AddTransient的生命周期

请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个

由于AddScoped对象是在请求的时候创建的,所以不能在AddSingleton对象中使用,甚至也不能在AddTransient对象中使用

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值