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>();