高效更新DbContext,无需依赖注入

问题描述 投票:0回答:1

我想编写一个

ClaimsPrincipal
扩展,返回与设置了
IsLimited
标志的用户关联的公司。

public static class ClaimsPrincipalExtensions
{
    public static bool IsLimitedUser(this ClaimsPrincipal principal)
    {
        ArgumentNullException.ThrowIfNull(principal);
        var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
        if (claim != null)
        {
            return dbContext.Users
                .Where(u => u.Id == claim.Value)
                .Select(u => u.Facility.Company.IsLimited)
                .FirstOrDefault();
        }
        return false;
    }
}

但是如何在上面的代码中初始化

dbContext
呢?

我正在考虑从我的 _Layout.cshtml 页面调用此方法,因此它将在每个页面请求上调用,因此我希望它尽可能优化。事实上,如果可能的话,我想用

ClaimsPrincipal
缓存该值。不管怎样,我第一次还是需要
DbContext

c# asp.net-core .net-core dbcontext
1个回答
0
投票

如果要在静态类中使用dbcontext,则需要使用方法注入,您应该修改方法以添加新参数IServiceProvider,然后从布局页面传递它。

更多详情,可以参考以下代码:

public static class ClaimsPrincipalExtensions
{


    public static bool IsLimitedUser(this ClaimsPrincipal principal, IServiceProvider serviceProvider)
    {
        ArgumentNullException.ThrowIfNull(principal);

   
        // Resolve DbContext from the service provider
        using (var scope = serviceProvider.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();  
            var claim = principal.FindFirst(ClaimTypes.NameIdentifier);
            if (claim != null)
            {
                //// Query the database
                //bool isLimited = dbContext.Users
                //    .Where(u => u.Id == claim.Value)
                //    .Select(u => u.Facility.Company.IsLimited)
                //    .FirstOrDefault();


                var test = dbContext.Users.ToList();
                 bool isLimited = true;

                return isLimited;
            }
        }

        return false;
    }
}

布局:

@using Microsoft.Extensions.DependencyInjection
@inject IServiceProvider ServiceProvider

...

@{

    var isLimitedUser = User.IsLimitedUser(ServiceProvider);
}


@if (isLimitedUser)
{
    <p>User has limited access.</p>
}
else
{
    <p>User has full access.</p>
}

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.