ActionContext в IActionContextAccessor, зарегистрированный через DI, является нулевым

2

У меня IActionContextAccessor проблема с IActionContextAccessor с использованием встроенного контейнера DI asp.net. Свойство 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;
    }
}


Что может быть причиной этого. Все предложения приветствуются

  • 0
    Где и как вы используете TenantProvider ? И вы уверены, что ActionContext фактически нулевой? Вы объединяете множество нулевых условных операторов.
  • 0
    Да ActionContext фактически нулевой. Я использую его в следующем порядке Controller -> Service -> UoW -> DbContext
Теги:
asp.net-core
asp.net-core-mvc
asp.net-core-2.0

1 ответ

2
Лучший ответ

Похоже, вы используете 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
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню