我有一个过滤器在我的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获得它,还是我错了?
这里有几件事需要检查。
- 您是否在启动类的
ConfigureServices
方法中注册了dbcontext ? 这样的
services.AddDbContext<YourDBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
- 您是否在
ConfigureServices
的IoC容器中注册了全局/或作为服务的过滤器?
使用此设置,您应该在过滤器中获得dbcontext。
否则,你可以使用服务定位器模式来解析dbcontext,而不需要注入构造函数。
var context = context.HttpContext.RequestServices.GetService<DataBaseContext>();
你的过滤器也应该像这样应用
[ServiceFilter(typeof(ApiAuth))]