C# Blazor:HttpContext.RequestServices提供的作用域实例与IServiceProvider不同

C# Blazor:HttpContext.RequestServices提供的作用域实例与IServiceProvider不同,c#,asp.net-core,blazor,blazor-server-side,C#,Asp.net Core,Blazor,Blazor Server Side,我需要从HttpContext.RequestServices(请参阅:)获取作用域实例。问题在于,在Blazor服务器呈现阶段,注入构造函数并从HttpContext.RequestServices.GetRequiredService返回的实例是不同的 让我们创建一个类,我们希望它有一个作用域实例 public class TestingClass { public int MyProperty { get; set; } } 和消费者阶层 public class ResultC

我需要从
HttpContext.RequestServices
(请参阅:)获取作用域实例。问题在于,在Blazor服务器呈现阶段,注入构造函数并从
HttpContext.RequestServices.GetRequiredService
返回的实例是不同的

让我们创建一个类,我们希望它有一个作用域实例

public class TestingClass {
    public int MyProperty { get; set; }
}
和消费者阶层

public class ResultClass {
    public string result;

    public ResultClass(TestingClass fromInjection, IHttpContextAccessor contextAccessor, IServiceProvider serviceProvider) {
        var fromRequest = contextAccessor.HttpContext.RequestServices.GetRequiredService<TestingClass>();
        var fromServiceProvider = serviceProvider.GetService<TestingClass>();
        var requestXinjection = (fromRequest == fromInjection);
        var serviceXinjection = (fromServiceProvider == fromInjection);
        result = $"Instance in from request and injection is the same {requestXinjection}. Instance in from request and service provider is the same {serviceXinjection}";
    }
}
现在,让我们将
ResultClass
实例注入Razor页面和Blazor组件(
render mode=“ServerPrerendered”

在“剃须刀”页面上,所有三个实例都是相同的:

来自请求和注入中的实例是相同的。请求和服务提供程序中的实例相同

blazor预渲染阶段,所有三个实例都是相同的:

来自请求和注入中的实例是相同的。请求和服务提供程序中的实例相同

在blazor渲染阶段,注入的实例与请求中的实例不同:

来自请求和注入中的实例相同False。请求和服务提供程序中的实例相同

依我看,在所有情况下,这三种情况都必须相同。这是真的吗

我对DI行为的解释是否错误?这是错误吗?

笔记 设置
render mode=“Server”
时,行为与渲染阶段相同(False,True)


我使用asp.net-core-3.1

你知道为什么会有这样的行为吗?@AurelienB:这种行为被报告为一个bug,但据说是设计出来的。如果你觉得自己更有说服力,你可以试着用不同的方式来报道。谢谢,我会看看我是否有时间来报道,我不确定我是否能更好地说服他们。关于他们处理来自Guice的DI的方式,.net Core的行为感觉是错误的。你知道为什么会有这样的行为吗?@AurelienB:这种行为被报告为bug,但据说是设计的。如果你觉得自己更有说服力,你可以试着用不同的方式来报道。谢谢,我会看看我是否有时间来报道,我不确定我是否能更好地说服他们。关于他们处理来自Guice的DI的方式,.NETCore的行为感觉是错误的。
services.AddHttpContextAccessor();           
services.AddScoped<TestingClass>();
services.AddTransient<ResultClass>();