前言
首先我们知道一个东西,那就是生命周期和timelife 的配置有关。
正文
首先看下IServiceProvider的数据结构:
其数据结构是一颗树:
我是一个抽象画家,红色部分是IServiceProvider,黑色部分是IServiceScope。
那么就看一下:IServiceScope。
var provider = new ServiceCollection()
.AddTransient<IFoo, Foo>()
.AddTransient<IBar, Bar>()
.AddTransient<IBaz, Baz>()
.AddTransient<IQux, Qux>()
.BuildServiceProvider();
provider.CreateScope();
这时候就创建了一个Scope:
在ServiceProviderServiceExtensions中:
/// <summary>
/// Creates a new <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceScope" /> that can be used to resolve scoped services.
/// </summary>
/// <param name="provider">The <see cref="T:System.IServiceProvider" /> to create the scope from.</param>
/// <returns>A <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceScope" /> that can be used to resolve scoped services.</returns>
public static IServiceScope CreateScope(this IServiceProvider provider)
{
return provider.GetRequiredService<IServiceScopeFactory>().CreateScope();
}
这时候通过一个IServiceScopeFactory创建了一个IServiceScope。
那么看下这个 Scope 到底是什么。
/// <summary>
/// The <see cref="M:System.IDisposable.Dispose" /> method ends the scope lifetime. Once Dispose
/// is called, any scoped services that have been resolved from
/// <see cref="P:Microsoft.Extensions.DependencyInjection.IServiceScope.ServiceProvider" /> will be
/// disposed.
/// </summary>
public interface IServiceScope : IDisposable
{
/// <summary>
/// The <see cref="T:System.IServiceProvider" /> used to resolve dependencies from the scope.
/// </summary>
IServiceProvider ServiceProvider
{
get;
}
}
重点不是可以获取一个ServiceProvider,而是IDisposable
也就是说IServiceScope 可以去控制ServiceProvider的垃圾回收。
在一个.net core 程序中root provide 通过控制IServiceScope 来控制scope ServiceProvider。
scope 类型的生命周期,保存在自我的ServiceProvider selfservices 中,而singleton 类型的生命周期保存在rootservice中。
当IServiceScope 被销毁的时候,那么ServiceProvider会被销毁,同样里面控制的selfservices也会被垃圾回收。
好的,我编不下了,一切皆在源码。