我可以在设置路线时使用 Ninject 吗?
Can I use Ninject when setting up my routes?
我有一个使用 Ninject 的 ASP.NET MVC5 网站。该站点用于在线杂志。
我想做的是设置一些路由,但从注入的存储库中提取数据。所以,我想要这样的路线...
routes.MapRoute("Section9", "Section9_Ask-the-professional",
new {controller = "Sections", action = "Detail", id = 9});
routes.MapRoute("Section10", "Section10_Confrontation",
new {controller = "Sections", action = "Detail", id = 10});
...其中部分 ID(上面示例中的 9 和 10)和部分名称是从存储库中提取的。
我可以在 RouteConfig.RegisterRoutes() 中访问注入的存储库吗?我尝试添加通常的代码...
[Inject]
public SectionsRepository<Section> Repository { get; set; }
...但这没有用,因为存储库始终为空。我试着让它变成静态的,但没有快乐。
有人有什么想法吗?我花了很多时间搜索,但没有找到任何东西,主要是由于一般路由或注入的结果中存在噪音。
如果我没看错,您想访问您的存储库以将文章名称分配给您的网址。可以做到,但首先,想想你刚刚在这里写了什么:
[Inject]
public SectionsRepository<Section> Repository { get; set; }
[Inject]
属性告诉框架任何被这个属性修饰的 属性 应该被 Ninject 赋值。你用 Ninject 实例化你的 RouteConfig class 吗?不,你不需要,(特别是因为 RegisterRoutes(...)
是静态的,所以无论如何它都无法访问实例级数据)因此你不会配置 Ninject 来对它做任何事情。所以你的 属性 显然是空的,因为 Ninject 不会触及你的 RouteConfig class.
解决方法:
添加这个
IDependencyResolver rs = DependencyResolver.Current;
将代码行添加到您的 RouteConfig class 任何您认为有意义的地方,例如作为默认分配值,或添加到 RegisterRoutes(...) 方法中,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
IDependencyResolver rs = DependencyResolver.Current;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new String[] { "MVCWebshop.WebUI.Controllers" }
);
}
}
要在此处访问您的 DI 实现,您显然必须在 调用 Global.asax 文件中的 RouteConfig.RegisterRoutes(RouteTable.Routes);
之前设置解析器 ,如下所示:
public class MvcApplication : System.Web.HttpApplication
{
protected IDependencyResolver dependencyResolver;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
dependencyResolver = new NinjectDependencyResolver();
DependencyResolver.SetResolver(dependencyResolver);
...
RouteConfig.RegisterRoutes(RouteTable.Routes);
...
}
}
希望对您有所帮助。
我有一个使用 Ninject 的 ASP.NET MVC5 网站。该站点用于在线杂志。
我想做的是设置一些路由,但从注入的存储库中提取数据。所以,我想要这样的路线...
routes.MapRoute("Section9", "Section9_Ask-the-professional",
new {controller = "Sections", action = "Detail", id = 9});
routes.MapRoute("Section10", "Section10_Confrontation",
new {controller = "Sections", action = "Detail", id = 10});
...其中部分 ID(上面示例中的 9 和 10)和部分名称是从存储库中提取的。
我可以在 RouteConfig.RegisterRoutes() 中访问注入的存储库吗?我尝试添加通常的代码...
[Inject]
public SectionsRepository<Section> Repository { get; set; }
...但这没有用,因为存储库始终为空。我试着让它变成静态的,但没有快乐。
有人有什么想法吗?我花了很多时间搜索,但没有找到任何东西,主要是由于一般路由或注入的结果中存在噪音。
如果我没看错,您想访问您的存储库以将文章名称分配给您的网址。可以做到,但首先,想想你刚刚在这里写了什么:
[Inject]
public SectionsRepository<Section> Repository { get; set; }
[Inject]
属性告诉框架任何被这个属性修饰的 属性 应该被 Ninject 赋值。你用 Ninject 实例化你的 RouteConfig class 吗?不,你不需要,(特别是因为 RegisterRoutes(...)
是静态的,所以无论如何它都无法访问实例级数据)因此你不会配置 Ninject 来对它做任何事情。所以你的 属性 显然是空的,因为 Ninject 不会触及你的 RouteConfig class.
解决方法: 添加这个
IDependencyResolver rs = DependencyResolver.Current;
将代码行添加到您的 RouteConfig class 任何您认为有意义的地方,例如作为默认分配值,或添加到 RegisterRoutes(...) 方法中,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
IDependencyResolver rs = DependencyResolver.Current;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new String[] { "MVCWebshop.WebUI.Controllers" }
);
}
}
要在此处访问您的 DI 实现,您显然必须在 调用 Global.asax 文件中的 RouteConfig.RegisterRoutes(RouteTable.Routes);
之前设置解析器 ,如下所示:
public class MvcApplication : System.Web.HttpApplication
{
protected IDependencyResolver dependencyResolver;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
dependencyResolver = new NinjectDependencyResolver();
DependencyResolver.SetResolver(dependencyResolver);
...
RouteConfig.RegisterRoutes(RouteTable.Routes);
...
}
}
希望对您有所帮助。