2

Я пытаюсь выяснить, как получить доступ к текущему имени пользователя за пределами контроллера ASP.NET.Injecting IHttpContextAccessor в ApplicationDbContext ASP.NET Core 1.0

Например, я пытаюсь сделать это:

Track Created and Modified fields Automatically with Entity Framework Code First

Для отслеживания установки на лиц в DbContext.

Вот мой ApplicationDbContext, но я получаю сообщение об ошибке говорящего _httpContextAccessor является null:

private readonly IHttpContextAccessor _httpContextAccessor; 

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor) 
    : base(options) 
{ 
    _httpContextAccessor = httpContextAccessor; 
} 

ответ

3

Попробуйте подающие IHttpContextAccessor интерфейса

Вы можете даже абстрактный его дальше, создав службу для предоставления только информацию вы хотите (что является текущим вошедшим в систему именем пользователя)

public interface IUserResolverService { 
    string GetUser(); 
} 

public class UserResolverService : IUserResolverService { 
    private readonly IHttpContextAccessor accessor; 
    public UserResolverService(IHttpContextAccessor accessor) { 
     this.accessor = accessor; 
    } 

    public string GetUser() { 
     var username = accessor?.HttpContext?.User?.Identity?.Name ; 
     return username ?? "unknown"; 
    } 
} 

Вам нужно настроить IHttpContextAccessor сейчас в Startup.ConfigureServices для того, чтобы иметь возможность вводить его:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
services.AddTransient<IUserResolverService, UserResolverService>(); 

и передать в ваше хранилище по мере необходимости для записи ассоциированного имени пользователя

+0

Я просто видел сообщение об этом на самом деле. Должен ли я просто ввести его в свой ApplicationDbContext и создать частную собственность? –

+0

Более или менее. yes – Nkosi

+0

Хорошо, я собираюсь дать ему понять, что он автоматически вводится. –

3

@Nkosi имеет правильный ответ, но пожалуйста, обратите внимание, что IHttpContextAccessor сейчас находится под пространством имен:

Microsoft.AspNetCore.Http; 

И уже не под:

Microsoft.AspNet.Http; 
Смежные вопросы