目录
一、生命周期
二、三种不同生命周期对象比较
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:瞬时生命周期
![](https://img-blog.csdnimg.cn/36f3a936d4b64dbb91e92ef336bbc4bc.png)
比较一下两个实例是否指向同一个对象
object.ReferenceEquals(t, t1);//比较两个实例是否来自同一个对象
object里边有个方法ReferenceEquals()用来比较是否为同一对象
输出结果:
false
说明不是两个实例不是指向同一个对象
换一种生命周期创建对象
2、AddSingleton:单例
代码:
![](https://img-blog.csdnimg.cn/9dcb86004f2940a59909e30cac599089.png)
输出结果:
true
![](https://img-blog.csdnimg.cn/590091114ae14cce9c1866e663dd8938.png)
说明两个实例指向同一个对象
3、AddScoped
在控制台程序中 范围是由程序员决定的、
在ASP.NET Core范围是由框架来决定的,默认是一次服务器请求是一个Scope
![](https://img-blog.csdnimg.cn/e7a45745eae54c919a399296ee2e8f5d.png)
范围是using大括号内
所以结果是true
所以下边再建一个对象scope2自然而然结果也是true
![](https://img-blog.csdnimg.cn/6ab6d760db65469da59de1c4ffb1ddf1.png)
那么想一下在两个范围内分别拿到两个对象 比较一下结果是不是true
代码如下:
![](https://img-blog.csdnimg.cn/de71bec4a96547af9723f36779b17525.png)
结果显而易见是false
![](https://img-blog.csdnimg.cn/bf1220dd921d4afb9d07f7e12ad38562.png)
总结:
在同一范围内拿到的对象是同一对象
在两个范围内拿到的对象不是同一对象
三者的区别:
AddTransient: 每次service请求都是获得不同的实例,暂时性模式:暂时性对象始终不同,无论是不是同一个请求(同一个请求里的不同服务)同一个客户端,每次都是创建新的实例
AddScoped: 对于同一个请求返回同一个实例,不同的请求返回不同的实例,作用域模式:作用域对象在一个客户端请求中是相同的,但在多个客户端请求中是不同的
AddSingleton: 每次都是获得同一个实例, 单一实例模式:单一实例对象对每个对象和每个请求都是相同的,可以说是不同客户端不同请求都是相同的
说明:
AddSingleton的生命周期:
项目启动-项目关闭 相当于静态类 只会有一个
AddScoped的生命周期:
请求开始-请求结束 在这次请求中获取的对象都是同一个
AddTransient的生命周期:
请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个
由于AddScoped对象是在请求的时候创建的,所以不能在AddSingleton对象中使用,甚至也不能在AddTransient对象中使用