通过 DI 注册的 IActionContextAccessor 中的 ActionContext 为 null
ActionContext in IActionContextAccessor registered through DI is null
我在 IActionContextAccessor
使用 asp.net 核心的内置 DI 容器时遇到一些问题。 IActionContextAccessor.ActionContext
属性 对每个请求都是空的。我正在尝试这样注册 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
。这通常会导致您遇到问题,因为 TenantProvider
可能在 IActionContextAccessor.ActionContext
尚未设置为当前正在执行的操作时实例化。
我建议您将构造函数中的逻辑移至 TentantProvider
的某个方法并从控制器中调用它。例如:
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
}
}
我在 IActionContextAccessor
使用 asp.net 核心的内置 DI 容器时遇到一些问题。 IActionContextAccessor.ActionContext
属性 对每个请求都是空的。我正在尝试这样注册 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
。这通常会导致您遇到问题,因为 TenantProvider
可能在 IActionContextAccessor.ActionContext
尚未设置为当前正在执行的操作时实例化。
我建议您将构造函数中的逻辑移至 TentantProvider
的某个方法并从控制器中调用它。例如:
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
}
}