ActionContext в IActionContextAccessor, зарегистрированный через DI, является нулевым - PullRequest
0 голосов
/ 16 октября 2018

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

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

1 Ответ

0 голосов
/ 17 октября 2018

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