ASP.NET CORE 依赖注入服务生命周期

依赖注入服务有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生命周期的实例,这样大家的理解就会更加深刻。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值