重新整理.net core 计1400篇[十] (.net core 中的依赖注入的服务的生命周期)

前言

首先我们知道一个东西,那就是生命周期和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也会被垃圾回收。

好的,我编不下了,一切皆在源码。

posted @ 2020-05-22 19:09  敖毛毛  阅读(400)  评论(0编辑  收藏  举报