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

Posted

技术标签:

【中文标题】MediatR - 处理查询中的当前用户【英文标题】:MediatR - Handling current user in query 【发布时间】:2019-03-27 02:33:27 【问题描述】:

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

【问题讨论】:

可能您可以为所有事件和命令创建一个带有 userId 属性抽象类,其中包含 IHttpContextAccessor 并分配 用户 ID。您的问题没有任何示例代码或上下文,因此我们帮不上什么忙。 【参考方案1】:

以下方法对我很有效,因为我让用户进入我的 Razor 项目所依赖的服务层。

根据 David Fowler here 的指导,我创建了一个 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;

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

services.AddTransient<IUserAccessor, UserAccessor>()

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

private readonly IUserAccessor _userAccessor;

public EventLogFactory(IUserAccessor userAccessor)

    _userAccessor = userAccessor ?? throw new ArgumentNullException(nameof(userAccessor));
 

UserAccessor 中引用的 IHttpContextAccessor 在不引用 Microsoft.AspNetCore.App 元包的项目中需要 Microsoft.AspNetCore.Http.Abstractions nuget并且还要求您的 Razor 项目在启动时也实现 AddHttpContextAccessor()

// Register IHttpContextAccessor for services to get access to the HttpContext.  
services.AddHttpContextAccessor();

希望这会有所帮助。

【讨论】:

出于兴趣,IUserAccessor 是否也可以注册为 Scoped 而不是 Transient 考虑到它在请求的生命周期内是相同的用户数据? @Pure.Krome 是的 公共接口 IUserAccessor ClaimsPrincipal User get;

以上是关于MediatR - 处理查询中的当前用户的主要内容,如果未能解决你的问题,请参考以下文章

具有通用处理程序和查询的 Mediatr

该程序无法找到 MediatR 查询 ASP.Net Core 的处理程序

如何取消 MediatR 发送的查询?

导航到 Visual Studio 2019(或 Rider)中的 MediatR 处理程序

MediatR 发布和 MediatR 发送

ASP.NET Core MediatR错误:使用容器注册处理程序