.Net Core框架容器依赖注入的生命周期

一.前言

  框架中依赖注入容器包括了三种生命周期,Singleton、Scoped和Transient。

  Singleton是全局实例,它存储到根容器上,从任何容器解析都会得到全局唯一的实例。

  Transient是瞬时实例,它不会存储到容器上,从任何容器解析都会重新实例化一个新的对象。

  Scoped是域内实例,哪个域的容器解析它,它就存储到哪个域的容器中,从这个域内解析得到都是同一个实例。

二.例子

public class Program
{
    public static void Main(string[] args)
    {
        var rootProvider = new ServiceCollection()
            .AddTransient<IA, A>()
            .AddScoped<IB, B>()
            .AddSingleton<IC, C>()
            .BuildServiceProvider();
        //create child provider
        var childProvider1 = rootProvider.CreateScope().ServiceProvider;
        var childProvider2 = rootProvider.CreateScope().ServiceProvider;

        GetService<IA>(childProvider1);
        GetService<IB>(childProvider1);
        GetService<IC>(childProvider1);
        Console.WriteLine();
        GetService<IA>(childProvider2);
        GetService<IB>(childProvider2);
        GetService<IC>(childProvider2);
        Console.WriteLine("Run Method End...");
    }

    public static void GetService<T>(IServiceProvider serviceProvider)
    {
        serviceProvider.GetService<T>();
        serviceProvider.GetService<T>();
    }
}
public interface IA { }
public interface IB { }
public interface IC { }
public class Base
{
    public Base()
    {
        Console.WriteLine($"{GetType().Name} Created");
    }
}
public class A : Base, IA { }
public class B : Base, IB { }
public class C : Base, IC { }

  运行,得到结果。

A Created
A Created
B Created
C Created

A Created
A Created
B Created
Run Method End...

  调用serviceProvider.GetService<T>()方法,可以创建实例并存储到容器上,获取获取之前创建的实例。调用该方法相当于一次请求,而在调用该方法的地方就是该请求的域。

  子容器childProvider1中 A对象被创建了两次,所以AddTransient每次请求时都会创建一个新的实例。

  子容器childProvider1中 B对象被创建了一次,所以AddScoped在同一域的请求中只创建一次实例。

  子容器childProvider1中 C对象被创建了一次,子容器childProvider2就没有创建实例,所以AddSingleton在整个程序中只创建一次实例。

 

 

 

 

 

 

 

 

  

posted @ 2024-02-20 16:17  shine声  阅读(67)  评论(0编辑  收藏  举报