Dependency injection 将DbContext注入ASP.NET Core 2 MVC中的自定义IRouteConstraint

Dependency injection 将DbContext注入ASP.NET Core 2 MVC中的自定义IRouteConstraint,dependency-injection,asp.net-core-mvc,asp.net-mvc-routing,entity-framework-core,Dependency Injection,Asp.net Core Mvc,Asp.net Mvc Routing,Entity Framework Core,我正在使用ASP.NETCore2。我正在尝试将DbContext注入到自定义IRouteConstraint中。但是,在上下文尝试调用Match方法之前,它似乎已被释放。我肯定我忽略了一些非常简单的事情。你知道如何将上下文传递到路由约束中吗 public void ConfigureServices(IServiceCollection services) { ... services.AddDbContext<ApplicationDbContext>(optio

我正在使用ASP.NETCore2。我正在尝试将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() });    
        ...
    });
}
public void配置服务(IServiceCollection服务)
{
...
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
...
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、ApplicationDbContext ApplicationDbContext)
{
...
app.UseMvc(路由=>
{
//路由验证
MapRoute(“routevalidation”,“{*route}”,new{controller=“Home”,action=“Reroute”},new{route=new shinNewRouteConstraint()});
...
});
}
这里有一种方法(尽管不确定这是否是最好的方法):

ShinyNewRoute约束
公共类ShinyNewRouteConstraint:IRouteConstraint
{
私有只读Func createDbContext;
公共ShinyNewRouteConstraint(Func createDbContext)
{
this.createDbContext=createDbContext;
}
公共布尔匹配(HttpContext HttpContext、IRouter路由、字符串routeKey、RouteValueDictionary值、RouteDirection RouteDirection)
{
使用(var dbContext=createDbContext())
{
//运行查询。。。
var users=dbContext.users.ToList();
//约束逻辑
}
返回false;
}
}
用法
//路由验证
routes.MapRoute(
“路线规避”,
“{*route}”,
新建{controller=“Home”,action=“Reroute”},
新建{route=new ShinyNewRouteConstraint(()=>
app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService())});
注意:我建议在这种情况下使用缓存,因为路由约束在每个请求上都是匹配的,这很容易用太多的请求淹没数据库

这里有一种方法(尽管不确定这是否是最好的方法):

ShinyNewRoute约束
公共类ShinyNewRouteConstraint:IRouteConstraint
{
私有只读Func createDbContext;
公共ShinyNewRouteConstraint(Func createDbContext)
{
this.createDbContext=createDbContext;
}
公共布尔匹配(HttpContext HttpContext、IRouter路由、字符串routeKey、RouteValueDictionary值、RouteDirection RouteDirection)
{
使用(var dbContext=createDbContext())
{
//运行查询。。。
var users=dbContext.users.ToList();
//约束逻辑
}
返回false;
}
}
用法
//路由验证
routes.MapRoute(
“路线规避”,
“{*route}”,
新建{controller=“Home”,action=“Reroute”},
新建{route=new ShinyNewRouteConstraint(()=>
app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService())});
注意:我建议在这种情况下使用缓存,因为路由约束在每个请求上都是匹配的,这很容易用太多的请求淹没数据库


您可以显示DbContext代码的启动吗?我已经添加了相应的启动代码段。请发布
ShinyNewRouteConstraint
的代码。您可以显示DbContext代码的启动吗?我已经添加了相应的启动代码段。请发布
ShinyNewRouteConstraint
的代码。是的,我会的。现在只是准备一个PoC。谢谢我的朋友!是的,我会的。现在只是准备一个PoC。谢谢我的朋友!
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>()) });