zoukankan      html  css  js  c++  java
  • 重新整理.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也会被垃圾回收。

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

  • 相关阅读:
    继承 多态
    封装练习
    PHP 面向对象封装
    面向对象 类和对象
    PHP前端和数据库的连接
    数组2
    PHP数组
    正则表达式
    PHP字符串
    linux基础
  • 原文地址:https://www.cnblogs.com/aoximin/p/12937964.html
Copyright © 2011-2022 走看看