当前位置:网站首页>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
边栏推荐
猜你喜欢
随机推荐
Oracle改成mysql
时间戳转格式化日期
Navicat 连接 oracle library is not loaded的解决方法
.Net Core 下使用 Quartz —— 【4】作业和触发器之作业属性和异常
var、let、const之间的区别
说说ts的心里话
Introduction and application of WMI Technology
邮箱字符串判断
Krypton zeal
Node访问服务器端静态资源
C language structure specifying initialization
js更改全部变量失败后改成return方法,终于解决解决问题
PN结、二极管原理详解与应用
小程序学习笔记(一)
POJ-The Unique MST
SQLite compilation
WebSocket(基础)
欢迎使用Markdown编辑器
几款笔记软件的优缺点
.Net Core 下使用 Quartz —— 【6】作业和触发器之触发器的日历