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 查询 ASP.Net Core 的处理程序