【问题标题】:Inject DbContext to Custom IRouteConstraint in ASP.NET Core 2 MVC在 ASP.NET Core 2 MVC 中将 DbContext 注入自定义 IRouteConstraint
【发布时间】:2017-10-12 14:49:04
【问题描述】:

我正在使用 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() });    
        ...
    });
}

【问题讨论】:

  • 你能展示你的 Startup for DbContext 代码吗?
  • 我已经添加了合适的 Startup sn-p。
  • 请贴出ShinyNewRouteConstraint的代码。

标签: dependency-injection asp.net-core-mvc asp.net-mvc-routing entity-framework-core


【解决方案1】:

这是一种方法(虽然不确定这是否是最好的方法):

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>()) });

注意:我建议在这种情况下使用缓存,因为路由约束在每个请求上都匹配,这很容易让过多的请求淹没您的数据库。

【讨论】:

  • 是的,我会的。现在只是组装一个 PoC。谢谢我的朋友!
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2017-09-05
  • 2018-05-18
  • 2011-02-24
  • 2019-03-22
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多