IActionContextAccessor

IActionContextAccessor

我在使用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
    }
}

08-25 23:55