• 重新整理.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也会被垃圾回收。

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

  • 相关阅读:
    node设置res.cookie跨域问题解决
    Rails常用插件
    什么是编程基础
    【数学之美】抽屉原理
    时分秒针重合问题
    如何理解【业务逻辑】
    【转】有关环境变量的若干问题?
    关于指针类型转化后在printf输出的问题
    rand * () 之间相互生成总结
    4.14做一个新浪微博的小东东
  • 原文地址:https://www.cnblogs.com/aoximin/p/12937964.html
Copyright © 2020-2023  润新知