如何为我的 API 过滤器获取 DBContext? (访问数据库)

How do I get a DBContext for my API filter? (To access the DB)

我的 API 中有一个过滤器(用于 Auth),但为了检查令牌,我必须查看我的数据库,这并不难,但是当我想通过我的数据库获取 DataBaseContext 时ctor 我不能再使用过滤器了。看这里:

This here is a piece of the filter class:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ApiAuth : Attribute, IAsyncActionFilter
{
    private readonly DataBaseContext _db;

    public ApiAuth(DataBaseContext db)
        => _db = db;

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
    }

This is a piece of the User Controller

[Route("api/v1/[controller]")]
[ApiController]
[ApiAuth]
public class UserController : Controller
{
}

“[ApiAuth]”现在给我一个错误,它需要一个 DataBaseContext,但它不能给它。

错误“CS7036:没有给出与“ApiAuth.ApiAuth(Databasecontext)”的形式参数“db”相匹配的参数。“

我的问题是,我不知道还有什么方法可以获取我的上下文,你只能通过 ctor 获取它,还是我错了?

这里有几件事要检查。

  1. 您是否在 ConfigureServices 启动方法中注册了 dbcontext class?

像这样

services.AddDbContext<YourDBContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
  1. 您是否在 ConfigureServices 中全局/或将过滤器注册为 IoC 容器中的服务?

使用此设置,您应该在过滤器中获得 dbcontext。

否则,您可以使用服务定位器模式来解析不需要构造函数注入的 dbcontext。

var context = context.HttpContext.RequestServices.GetService<DataBaseContext>();

你的过滤器也应该像这样应用

[ServiceFilter(typeof(ApiAuth))]