.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在整个程序中只创建一次实例。