gpt4 book ai didi

c# - 验证.net核心中单例内部 transient 的范围?

转载 作者:行者123 更新时间:2023-12-04 01:01:54 26 4
gpt4 key购买 nike

我有 3 个接口(interface)(用于单例/作用域/ transient ):

    public interface ISingleton
{
}

class Singlet : ISingleton
{
}

public interface IScoped
{
}

class Scoped : IScoped
{
}


public interface Itransient
{
}

class Transient : Itransient
{
}
我将它们注册为:
 services.AddScoped<IScoped, Scoped>();
services.AddTransient<Itransient, Transient>();
services.AddSingleton<ISingleton, Singlet>();
如果我尝试将作用域服务注入(inject)到 singleton ,我应该(并且确实)得到一个异常(我知道原因):
    public interface ISingleton
{
}

class Singlet : ISingleton
{

public Singlet( IScoped sc)
{

}
}

Some services are not able to be constructed (Error while validatingthe service descriptor 'ServiceType: WebApplication2.ISingletonLifetime: Singleton ImplementationType: WebApplication2.Singlet':Cannot consume scoped service 'WebApplication2.IScoped' from singleton'WebApplication2.ISingleton'.)


但是如果我尝试注入(inject) transient ,则不会出现异常:
public interface ISingleton
{
}

class Singlet : ISingleton
{

public Singlet( Itransient tr)
{

}
}
问题:
为什么 .net 核心禁止注入(inject)较短生命周期(范围)的服务引发异常,同时允许将 transient 注入(inject)单例?

最佳答案

我建议先阅读:When are .NET Core dependency injected instances disposed?
(前言:我的回答假设服务实现本身永远不会处理任何注入(inject)的服务。)

Why does .net core forbids injecting a shorter lifetime (scoped) services raising an exception, while allowing transient to be injected to a singleton?


  • transient 服务的生命周期与它在其中实例化的容器相同。
  • transient 服务可以在根作用域/根容器(单例所在的位置)或作用域容器内实例化。
  • 新 transient 服务的生命周期 实例 注入(inject)单例的是单例容器(通常是根容器或根范围)的生命周期。
  • 也就是说,只有在处理根容器时才会处理 transient 实例,通常是在应用程序关闭期间 (IHost.Dispose())

  • 新 transient 服务的生命周期 实例 注入(inject)到作用域服务中的是该作用域容器的生命周期。
  • 也就是说,仅在释放作用域时才会释放 transient 实例(在 ASP.NET Core 中,即在 HTTP 请求生命周期结束时)。

  • 一个新的 transient 服务注入(inject)另一个 transient 服务的生命周期就是最终消费者的生命周期,由 DI 提供者构建。


  • 简而言之: transient 服务的生命周期与其注入(inject)的服务相同——不会更长,也不会更短。这就是为什么它是允许的。
    而作用域服务的生命周期比根作用域/根容器的生命周期短,并且根作用域/根容器用于保存单例实例,因此作用域服务不能被单例使用(更重要的是它是因为子作用域在根作用域的上下文中不存在)。

    关于c# - 验证.net核心中单例内部 transient 的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68068900/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com