Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 在.Net Core中使用依赖项注入的自定义路由约束_Dependency Injection_Asp.net Core_Asp.net Core Mvc_Asp.net Mvc Routing_Entity Framework Core - Fatal编程技术网

Dependency injection 在.Net Core中使用依赖项注入的自定义路由约束

Dependency injection 在.Net Core中使用依赖项注入的自定义路由约束,dependency-injection,asp.net-core,asp.net-core-mvc,asp.net-mvc-routing,entity-framework-core,Dependency Injection,Asp.net Core,Asp.net Core Mvc,Asp.net Mvc Routing,Entity Framework Core,我正在尝试实现一个自定义路由约束,该约束将检查数据库中的信息。我已经让路由约束起作用了,但在尝试向类中注入DbContext以使用数据库时遇到了无参数构造函数问题。这是我的密码: 我的自定义管线约束: 公共类DynamicPageRouteConstraint:IRouteConstraint { public const string ROUTE_LABEL=“dbDynamicRoute”; 私有应用程序上下文数据库; 公共动态路由约束(ApplicationDbContext\u db)

我正在尝试实现一个自定义路由约束,该约束将检查数据库中的信息。我已经让路由约束起作用了,但在尝试向类中注入DbContext以使用数据库时遇到了无参数构造函数问题。这是我的密码:

我的自定义管线约束:

公共类DynamicPageRouteConstraint:IRouteConstraint
{
public const string ROUTE_LABEL=“dbDynamicRoute”;
私有应用程序上下文数据库;
公共动态路由约束(ApplicationDbContext\u db)
{
db=_db;
}
公共布尔匹配(HttpContext HttpContext、IRouter路由、字符串routeKey、RouteValueDictionary值、RouteDirection RouteDirection)
{
List items=db.dynamicpage.Select(p=>p.Url.ToList();
if(items.Contains(值[“dynamicPageFriendlyURL”]))
{
返回true;
}
返回false;
}
}
Startup.cs:

public void配置服务(IServiceCollection服务)
{
...
services.AddDbContext(options=>options.UseSqlServer(ConnectionString));
配置(选项=>
{
options.ConstraintMap.Add(dynamicPageroutConstraint.ROUTE_标签,typeof(dynamicPageroutConstraint));
});
services.AddMvc();
}
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
...
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“DynamicPageRoutes”,
模板:“{*dynamicPageFriendlyURL:+DynamicPageRouteConstraint.ROUTE_LABEL+”}”,
默认值:新建{controller=“DynamicPage”,action=“Loader”},
约束:new{dynamicPageFriendlyURL=new DynamicPageRouteConstraint(app.ApplicationServices.GetRequiredService())};
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}
因此,我的问题是:

目前的代码在startup.cs中遇到我的路由后,立即抱怨缺少无参数构造函数

如果我在我的RouteConstraint实现中放置一个无参数构造函数,我可以让代码工作,但是当命中路由时,它会被命中两次,一次是注入依赖项,然后再次使用无参数构造函数,这意味着没有实例化db对象

我不想通过实例化一个新的dbContext对象来放弃注入dbContext,因为我需要指定一个连接字符串,这将给我们已经实现的开发/生产连接字符串设置带来很大的麻烦

我的问题是:

为什么需要无参数构造函数

为什么我的路线会被呼叫两次?(一次使用注入式ctr,一次使用无参数ctr)

有没有更好的方法将依赖项注入到IRouteConstraint的实现中

有没有更好的方法可以做到这一点?我正在尝试为存储在数据库中的页面提供自定义URL


感谢您的帮助!谢谢

我认为您在MapRoute中应用了两次约束,一次在template参数中(系统将在其中创建没有构造函数的约束类实例),然后在constraints参数中。我想你的答案是把模板改成

template: "{*dynamicPageFriendlyUrl}"

然后系统将不会尝试在模板级别应用约束。

在匹配功能中获取数据库服务

var db = (ApplicationDbContext)httpContext.RequestServices.GetService(typeof(ApplicationDbContext));

非常感谢。这解决了双重调用和依赖注入/构造函数问题。