我想让当前用户获取用户的信息,例如电子邮件.但我不能在asp.net核心中这样做.我很困惑这是我的代码.
HttpContext在控制器的构造函数中几乎为null .在每个动作中获得用户并不好.我想获得用户的信息并将其设置为ViewData;
public DashboardController()
{
var user = HttpContext.User.GetUserId();
}
Run Code Online (Sandbox Code Playgroud) 我使用ASP.NET Core 2.1并希望User在服务级别获取.
我已经看到了HttpContextAccessor注入某个服务然后我们获取当前User通道的示例UserManager
var user = await _userManager.GetUserAsync(accessor.HttpContext.User);
Run Code Online (Sandbox Code Playgroud)
或在控制器中
var user = await _userManager.GetUserAsync(User);
Run Code Online (Sandbox Code Playgroud)
问题:
注入HttpContextAccessor服务似乎是错误的 - 仅仅因为我们违反了SRP并且服务层没有被隔离(它依赖于http上下文).
我们当然可以在控制器中获取用户(一种更好的方法),但我们面临两难 - 我们根本不想User在每个服务方法中作为参数传递
我花了几个小时思考如何最好地实现它,并提出了一个解决方案.我不完全确定我的方法是否足够,并且不违反任何软件设计原则.
共享我的代码希望从StackOverflow社区获得建议.
这个想法如下:
首先,我介绍SessionProvider哪些注册为Singleton.
services.AddSingleton<SessionProvider>();
Run Code Online (Sandbox Code Playgroud)
SessionProvider具有Session用于保持属性User,Tenant等等.
其次,我介绍SessionMiddleware并注册它
app.UseMiddleware<SessionMiddleware>();
Run Code Online (Sandbox Code Playgroud)
在Invoke我解决的方法中HttpContext,SessionProvider&UserManager.
我拿 User
然后我初始化单身人士的Session属性ServiceProvider:
sessionProvider.Initialise(user);
在这个阶段ServiceProvider …