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