将 DbContext 注入 ASP.NET Core 2 MVC 中的自定义 IRouteConstraint
Inject DbContext to Custom IRouteConstraint in ASP.NET Core 2 MVC
我正在使用 ASP.NET Core 2。我正在尝试将 DbContext 注入自定义 IRouteConstraint。但是,上下文似乎在它尝试调用 Match 方法之前就被处理掉了。我确定我在这里忽略了一些非常简单的事情。有什么想法可以将上下文传递到路由约束中吗?
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext applicationDbContext)
{
...
app.UseMvc(routes =>
{
// Route validation
routes.MapRoute("routevalidation", "{*route}", new { controller = "Home", action = "Reroute" }, new { route = new ShinyNewRouteConstraint() });
...
});
}
这是一种方法(虽然不确定这是否是最好的方法):
ShinyNewRouteConstraint
public class ShinyNewRouteConstraint : IRouteConstraint
{
private readonly Func<ApplicationDbContext> createDbContext;
public ShinyNewRouteConstraint(Func<ApplicationDbContext> createDbContext)
{
this.createDbContext = createDbContext;
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
using (var dbContext = createDbContext())
{
// Run a query...
var users = dbContext.Users.ToList();
// Constraint logic
}
return false;
}
}
用法
// Route validation
routes.MapRoute(
"routevalidation",
"{*route}",
new { controller = "Home", action = "Reroute" },
new { route = new ShinyNewRouteConstraint(() =>
app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<ApplicationDbContext>()) });
NOTE: I recommend using caching in this scenario because route constraints are matched on every request, which could easily flood your database with too many requests.
我正在使用 ASP.NET Core 2。我正在尝试将 DbContext 注入自定义 IRouteConstraint。但是,上下文似乎在它尝试调用 Match 方法之前就被处理掉了。我确定我在这里忽略了一些非常简单的事情。有什么想法可以将上下文传递到路由约束中吗?
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext applicationDbContext)
{
...
app.UseMvc(routes =>
{
// Route validation
routes.MapRoute("routevalidation", "{*route}", new { controller = "Home", action = "Reroute" }, new { route = new ShinyNewRouteConstraint() });
...
});
}
这是一种方法(虽然不确定这是否是最好的方法):
ShinyNewRouteConstraint
public class ShinyNewRouteConstraint : IRouteConstraint
{
private readonly Func<ApplicationDbContext> createDbContext;
public ShinyNewRouteConstraint(Func<ApplicationDbContext> createDbContext)
{
this.createDbContext = createDbContext;
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
using (var dbContext = createDbContext())
{
// Run a query...
var users = dbContext.Users.ToList();
// Constraint logic
}
return false;
}
}
用法
// Route validation
routes.MapRoute(
"routevalidation",
"{*route}",
new { controller = "Home", action = "Reroute" },
new { route = new ShinyNewRouteConstraint(() =>
app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<ApplicationDbContext>()) });
NOTE: I recommend using caching in this scenario because route constraints are matched on every request, which could easily flood your database with too many requests.