我如何为我的API过滤器获得DBContext ?(访问DB)



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

这是过滤器类的一部分:

[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)
{
}

这是User Controller的一部分

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

"[ApiAuth]";现在给我一个错误,它期望一个DataBaseContext,它不能给它。

错误"CS7036:没有给出与形式形参"db"匹配的参数。的"ApiAuth.ApiAuth (Databasecontext)"!">

我的问题是,我不知道如何获得我的上下文,你只能通过actor获得它,还是我错了?

这里有几件事需要检查。

  1. 您是否在启动类的ConfigureServices方法中注册了dbcontext ?
  2. 这样的

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

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

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

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

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

[ServiceFilter(typeof(ApiAuth))]

最新更新