gpt4 book ai didi

c# - 通过 DI 注册的 IActionContextAccessor 中的 ActionContext 为 null

转载 作者:行者123 更新时间:2023-11-30 21:31:48 30 4
gpt4 key购买 nike

我在 IActionContextAccessor 使用 asp.net core 的内置 DI 容器时遇到一些问题。 IActionContextAccessor.ActionContext 属性在每个请求上都为 null。我正在尝试像这样注册 IActionContextAccessor:

services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>( );
services.TryAddScoped<ITenantProvider, TenantProvider>( );


我正在尝试在此处访问 ActionContextAccessor.ActionContext

public TenantProvider( SomeTenantsDbContext context, IActionContextAccessor accessor )
{
var alias = accessor?.ActionContext?.RouteData?.Values["tenant"]?.ToString();
if(alias != null)
{
_tenantId = context.Tenants.FirstOrDefault( t => t.Alias == alias )?.Id;
}
}


这可能是什么原因造成的。欢迎所有建议

最佳答案

看起来您正在 TenantProvider 的构造函数中使用 IActionContextAccessor.ActionContext。这通常会导致您遇到问题,因为当 IActionContextAccessor.ActionContext 尚未设置为当前正在执行的操作时,可能会实例化 TenantProvider

我建议您将构造函数中的逻辑移至 TentantProvider 的某个方法并从 Controller 中调用它。例如:

private readonly SomeTenantsDbContext _context;
privat readonly IActionContextAccessor _accessor;

public TenantProvider(SomeTenantsDbContext context, IActionContextAccessor accessor )
{
_context = context;
_accessor = accessor;
}

public void DoStuuff()
{
var alias = _accessor?.ActionContext?.RouteData?.Values["tenant"]?.ToString();
if(alias != null)
{
var tenantId = _context.Tenants.FirstOrDefault( t => t.Alias == alias)?.Id;
// Do something with tenant id
}
}

关于c# - 通过 DI 注册的 IActionContextAccessor 中的 ActionContext 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52843824/

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