MediatR-处理查询中的当前用户

Zeu*_*s82 1 c# mediatr asp.net-core-2.2

在查询中为当前用户建模的最佳方法是什么?我正在创建一个剃刀页面应用程序。执行查询和命令时,我需要能够附加当前用户。有推荐的方法可以做到这一点吗?

Chr*_*.ZA 6

下面的方法对我来说效果很好,因为我让用户进入了Razor项目所依赖的服务层。

按照大卫·福勒指导在这里,我创建了一个UserAccessor类,如下所示:

public class UserAccessor : IUserAccessor
{
    private readonly IHttpContextAccessor _accessor;

    public UserAccessor(IHttpContextAccessor accessor)
    {
        _accessor = accessor ?? throw new ArgumentNullException(nameof(accessor));
    }

    public ClaimsPrincipal User => _accessor.HttpContext.User;
}
Run Code Online (Sandbox Code Playgroud)

我在启动时通过注册在我的Razor项目中

services.AddTransient<IUserAccessor, UserAccessor>()
Run Code Online (Sandbox Code Playgroud)

然后将其注入MediatR处理程序和我的DbContext以及所需的一些工厂中。

private readonly IUserAccessor _userAccessor;

public EventLogFactory(IUserAccessor userAccessor)
{
    _userAccessor = userAccessor ?? throw new ArgumentNullException(nameof(userAccessor));
} 
Run Code Online (Sandbox Code Playgroud)

IHttpContextAccessor中引用UserAccessor需要Microsoft.AspNetCore.Http.Abstractions在不参考项目的NuGet Microsoft.AspNetCore.App元数据包,也将需要你的剃须刀工程实施AddHttpContextAccessor()的启动,以及:

// Register IHttpContextAccessor for services to get access to the HttpContext.  
services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 出于兴趣,考虑到在请求的生命周期内它是相同的用户数据,“IUserAccessor”是否也可以注册为“Scoped”而不是“Transient”? (2认同)