将 IHttpContextAccessor 注入 ApplicationDbContext ASP.NET Core 1.0

Injecting IHttpContextAccessor into ApplicationDbContext ASP.NET Core 1.0

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

例如我正在尝试这样做:

Track Created and Modified fields Automatically with Entity Framework Code First

要在 DbContext 中设置对实体的跟踪。

这是我的 ApplicationDbContext,但我一直收到错误提示 _httpContextAccessor is null:

private readonly IHttpContextAccessor _httpContextAccessor;

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

尝试注入 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";
    }
}

您现在需要在 Startup.ConfigureServices 中设置 IHttpContextAccessor 以便能够注入它:

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

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

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

Microsoft.AspNetCore.Http;

并且不再在:

Microsoft.AspNet.Http;