将IHttpContextAccessor注入ApplicationDbContext ASP.NET Core 1.0

Bla*_*ell 5 c# entity-framework asp.net-core-mvc asp.net-core asp.net-core-1.0

我试图弄清楚如何访问ASP.NET控制器之外的当前登录用户名.

例如,我试图这样做:

使用实体框架代码自动跟踪创建和修改字段

设置跟踪实体的跟踪DbContext.

这是我的,ApplicationDbContext但我一直收到错误的说法_httpContextAccessor是null:

private readonly IHttpContextAccessor _httpContextAccessor;

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
    : base(options)
{
    _httpContextAccessor = httpContextAccessor;
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 9

尝试注入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";
    }
}
Run Code Online (Sandbox Code Playgroud)

你需要设置IHttpContextAccessor现在Startup.ConfigureServices为了能够注入它:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//OR
//services.AddHttpContextAccessor();
services.AddTransient<IUserResolverService, UserResolverService>();
Run Code Online (Sandbox Code Playgroud)

并根据需要将其传递到您的存储库以记录相关的用户名


Ste*_*ner 6

@Nkosi 有正确的答案,但请注意 IHttpContextAccessor 现在位于命名空间下:

Microsoft.AspNetCore.Http;
Run Code Online (Sandbox Code Playgroud)

不再下:

Microsoft.AspNet.Http;
Run Code Online (Sandbox Code Playgroud)