我可以在设置路线时使用Ninject吗?

时间:2015-06-21 16:37:17

标签: asp.net-mvc asp.net-mvc-routing ninject ninject.web.mvc

我有一个使用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; }

...但是这没有用,因为存储库总是为空。我试着让它静止,但没有快乐。

任何想法?我花了很多时间搜索,但没有找到任何东西,这主要是由于路由或注入结果产生的噪音。

1 个答案:

答案 0 :(得分:1)

如果我说得对,您希望有权访问您的存储库,以便为您的网址指定文章名称。可以这样做,但首先要考虑一下你刚才写的内容:

[Inject]
public SectionsRepository<Section> Repository { get; set; }

[Inject]属性告诉框架,应该为Ninject分配由此属性修饰的任何属性。你用Ninject实例化你的RouteConfig类吗?不,你不是,(尤其是RegisterRoutes(...)是静态的,所以它无论如何都无法访问实例级数据)因此你不能将Ninject配置为对它做任何事情。所以你的财产显然是空的,因为Ninject不会触及你的RouteConfig课程。

解决方案: 添加此

IDependencyResolver rs = DependencyResolver.Current;

类路径中的代码行放入RouteConfig类中,无论您认为它是有意义的,如默认赋值,还是注册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);
        ...
    }
}

希望这有帮助。