重新整理.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也会被垃圾回收。
好的,我编不下了,一切皆在源码。
分类:
.net core(web)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)