我有个办法这是因为_applicationUserTask
只执行一次,但可以等待多次.这意味着它不会反复执行.
我没有包括它,但您可以定义一个像IApplicationUserAccessor
这样的接口.或者,您可以直接向DI容器注册这个类.这取决于您是要将接口还是具体类注入到控制器中.
重要的是,必须将其注册为作用域.
services.AddScoped<ApplicationUserAccessor>();
...以确保每个请求都有一个新实例.
public class ApplicationUserAccessor
{
private readonly Task<ApplicationUser> _applicationUserTask;
public ApplicationUserAccessor(
IHttpContextAccessor httpContextAccessor,
IUserManager userManager)
{
_applicationUserTask = GetUserAsync(httpContextAccessor, userManager);
}
public async Task<ApplicationUser> GetCurrentApplicationUser()
{
return await _applicationUserTask.ConfigureAwait(false);
}
private static async Task<ApplicationUser> GetUserAsync(
IHttpContextAccessor httpContextAccessor,
IUserManager userManager)
{
HttpContext httpContext = httpContextAccessor.HttpContext;
ClaimsPrincipal httpContextUser = httpContext?.User;
if (httpContextUser == null)
{
return null;
}
return await userManager.GetApplicationUser(httpContextUser);
}
}
您还可以将其与缓存相结合.您可以将生命周期 更长的缓存实例注入到此类中.