У меня 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;
}
}
Что может быть причиной этого. Все предложения приветствуются
Похоже, вы используете 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
}
}
TenantProvider
? И вы уверены, чтоActionContext
фактически нулевой? Вы объединяете множество нулевых условных операторов.ActionContext
фактически нулевой. Я использую его в следующем порядкеController
->Service
->UoW
->DbContext