当前位置:网站首页>ASP.NET CORE 依赖注入服务生命周期
ASP.NET CORE 依赖注入服务生命周期
2022-04-23 05:55:00 【begeneral】
依赖注入服务有3种生命周期:Transient;Scoped;Singleton
Transient:即用即建,用后即弃。就是每次获取这个服务的实例时都要创建一个这个服务的实例。
Scoped:这种类型的服务实例保存在当前依赖注入容器(IServiceProvider)上,这个后面会有详细的讲解。
Singleton:单例。即只保存一个服务实例
下面我们来做一个实例的演示,让大家可以更深入地理解这3中生命周期
我的测试环境:win10+vs2019+.net core 3.1
新建一个.NET CORE的控制台应用,添加NuGet包:Microsoft.Extensions.DependencyInjection和Microsoft.Extensions.DependencyInjection.Abstractions
新建一个Base类,继承自IDisposable接口。因为这样我们可以知道继承自这个基类的实例是什么时候释放的
Base类的代码如下:
public class Base:IDisposable
{
public Base() => Console.WriteLine($"An Instance of {GetType().Name} is created");
public void Dispose() => Console.WriteLine($"The Instance of {GetType().Name} is disposed");
}
接着定义3个接口,表示服务类型:
public interface IBaz
{
}
public interface IBar
{
}
public interface IFoo
{
}
定义3个实现分别实现这3个接口的类,这些类继承自Base和IDispose
public class Baz:Base,IBaz
{
}
public class Bar:Base,IBar
{
}
public class Foo:Base,IFoo
{
}
接下来在Main函数中创建依赖注入容器。这个容器是在using语句中创建的,所以当using语句执行结束的时候就会调用Dispose来释放这个容器
static void Main(string[] args)
{
using (var root = new ServiceCollection().AddTransient<IFoo, Foo>()
.AddScoped<IBar, Bar>()
.AddSingleton<IBaz, Baz>().BuildServiceProvider())
{
using (var scope = root.CreateScope())
{
var provider = scope.ServiceProvider;
provider.GetService<IFoo>();
provider.GetService<IBar>();
provider.GetService<IBaz>();
Console.WriteLine("child container is disposed");
}
Console.WriteLine("root container is disposed");
}
Console.ReadKey();
}
我们创建一个根容器,然后用这个根容器创建了一个子容器。3个服务实例的生命周期分别是Transient、Scoped、Singleton。执行结果如下:

服务实例的创建都是在获取服务实例的时候创建的,然而实例的释放确不是一起的。Bar和Foo的生命周期是Scoped和Transient,
所以当子容器释放的时候,这2个实例也就释放了。Baz的生命周期是单例,它是存放在根容器(root)里面的,所以当子容器释放的
时候,它并没有释放,直到根容器释放的时候它才释放。
对于ASP.NET CORE应用来说,它具有一个与当前应用绑定的代表全局根容器的IServiceProvider对象。对于处理的每个次请求,ASP.NET CORE
框架都会利用这个根容器来创建基于当前请求的服务范围(也就是Scoped生命周期),并利用后者提供的IServiceProvider对象来提供请求处理所需的
服务实例。请求处理完成后,Scoped生命周期的实例被终结,对应的子容器也被释放。
所以在同一个请求中,Scoped生命周期的实例只被创建一次。大家也可以试一下,在同一个请求中用GetService多次获取Scoped生命周期的实例,
然后在多个请求中获取Scoped生命周期的实例,这样大家的理解就会更加深刻。
版权声明
本文为[begeneral]所创,转载请带上原文链接,感谢
https://blog.csdn.net/niechaoya/article/details/112769109
边栏推荐
猜你喜欢

js获取链接?后边的参数名称或者值,根据url ?后的参数做判断

三极管原理及特性分析

查漏补缺(三)

CUDA project encountered a series of compilation problems after changing the environment (computer)

五个路由守卫的使用

Redux概述

小程序学习笔记(一)
VHDL arbitrary frequency divider (50% duty cycle)

CUDA environment installation

2020 Jiangsu Collegiate Programming Contest-A.Array
随机推荐
Modify registry values
v-for下定时给图片添加动画
Router对象、Route对象、声明式导航、编程式导航
el-table添加序号
Joseph sequence segment tree o (nlogn)
Arm common assembly instructions
FOC SVPWM function pwmc_ Setphasevoltage parsing
Node data flow
【正河源刀具相关】
欢迎使用Markdown编辑器
【ES6】 Promise相关(事件循环,宏/微任务,promise,await/await)
Palindromic Primes
.Net Core3.1 使用 RazorEngine.NetCore 制作实体生成器 (MVC网页版)
js获取链接?后边的参数名称或者值,根据url ?后的参数做判断
Incremental update of client software
查漏补缺(八)
三极管原理及特性分析
PN结、二极管原理详解与应用
Log writing method (with time)
如何使用input表单向服务发送(占用较小)图片文件(body传输)?涉及到FileReader内置对象