我在使用asp.net core的内置DI容器的IActionContextAccessor
时遇到了一些问题。每个请求的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;
}
}
这可能是什么原因。欢迎所有建议
最佳答案
看起来您正在IActionContextAccessor.ActionContext
的构造函数中使用TenantProvider
。这通常会导致您遇到问题,因为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
}
}