我有一个用C#编写的ASP.NET Core MVC项目,并使用ASP.NET Core Identity.

我有一个具有多个操作的控制器,用于从数据库进行读/写操作,其中查询依赖于每个请求的值为ApplicationUser.Id.

如何避免连续调用下面的方法来查找当前的ApplicationUser并获得它们的Id

protected async Task<ApplicationUser> GetCurrentApplicationUser()
{
    var httpContextUser = HttpContext.User;
        
    return await _userManager.GetUserAsync(httpContextUser);
}

我纯粹是从性能的Angular 来看待这个问题的.

我们将非常感谢您的意见,谢谢.

推荐答案

我有个办法这是因为_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);
    }
}

您还可以将其与缓存相结合.您可以将生命周期 更长的缓存实例注入到此类中.

Csharp相关问答推荐

无法从具有一对多关系的C#类中使用Swagger创建记录

WPF Windows初始化正在锁定. Net 8中分离的线程

Polly使用泛型重试和重试包装函数

将现有字段映射到EFCore中的复杂类型

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

C#无法让WinForm进度条生成动画错误跨线程操作无效

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

每个http请求需要60秒,为什么?

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

关于扩展文件类C#的矛盾

如何在.NET Maui中将事件与MVVM一起使用?

使用C#和.NET 7.0无法访问Cookie中的数据

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

C#Microsoft.CodeAnalysis.CSharp.Scriiting不等待并行.对于

当我手动停止和关闭系统并打开时,Windows服务未启动

如何在ASP.NET Core 8中获取键控服务词典

从HTML元素获取 colored颜色

如何处理ASP.NET Core中包含两个构造函数的控制器?