从头开始使用ASP.NET MVC 2和Ninject 2

Run*_*sen 9 ninject-2 asp.net-mvc-2

我刚刚在一个新项目上做了File - > New Project.啊,绿色田野的气味.

我正在使用刚刚发布的ASP.NET MVC 2(即没有预览或发布候选版本,真实的东西),并且认为我使用Ninject 2(也是已发布的版本)与MVC扩展开始了一个良好的开端.我下载了MVC扩展项目,在VS2008Sp1中打开它,在发布模式下构建它,然后进入mvc2\build\release文件夹并将Ninject.dll和Ninject.Web.Mvc.dll从那里复制到我的Libraries文件夹中项目(这样我就可以在源代码管理中把它们拉到一边,并且每个地方都有正确的版本).我没有包含相应的.xml文件 - 我应该吗?他们只提供智能感知或其他功能吗?我相信没什么大不了的.

Anyhoo,我遵循了我能找到的最新建议; 我在我的MVC2项目中引用了DLL,然后开始使用Global.asax.cs.首先,我让它继承自NinjectHttpApplication.我删除了Application_Start()方法,并改为使用OnApplicationStarted().这是方法:

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
} 
Run Code Online (Sandbox Code Playgroud)

我也遵循VS的建议并实现了CreateKernel方法:

protected override Ninject.IKernel CreateKernel() 
{ 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    return new StandardKernel(); 
} 
Run Code Online (Sandbox Code Playgroud)

就这些.没有其他修改项目.

您会注意到RegisterAllControllersIn()方法在上面的两个地方被注释掉了.我想我可以用三种不同的组合来运行它,所有这些都带有时髦的副作用;

  • 像上面那样运行它.

然后,我将获得标准的"欢迎使用ASP.NET MVC"页面的所有荣耀.但是,在浏览器中正确显示此页面后,VS会向我显示抛出的异常.它抛出NinjectControllerFactory.GetControllerInstance(),它在controllerType参数中使用NULL值调用.请注意,这是在/ Home页面呈现后发生的 - 我不知道为什么再次调用它,并且通过使用断点我已经确定已成功调用了HomeController的GetControllerInstance().为什么这个带有controllerType的新调用为null?我真的不知道.此时按F5将我带回浏览器,没有任何投诉.

  • 取消注释CreateKernel()中的RegisterAllControllersIn()方法

这是东西真正开始变得时髦的地方.现在我收到404错误.有时我在RegisterAllControllersIn()行上也得到了一个ArgumentNullException,但这种情况非常罕见,而且我无法重现它.

  • 取消注释OnApplicationStarted()中的RegisterAllControllers()方法

(并将注释放回CreateKernel()中的注释)

结果似乎与第1点中的行为完全相同.

因此,为了永远不进行 - 是否有关于如何使用Ninject 2(两个非beta版本)设置MVC 2项目以获取Ninject提供的控制器的确切分步指南?当然,我将开始提供一些实际的注入东西(如ISession对象和存储库,记录器等),但我想我会先让它工作.

任何帮助将非常感谢!

(也发布到Ninject Google Group)

Run*_*sen 10

我觉得很难回答我自己的问题,但为了任何可能会徘徊在这里的人的利益......

这不是Ninject问题,实际上,它似乎是Cassini(内置于VS2k8中的Web服务器)的问题,它处理这些请求的方式与IIS处理它们的方式不同.基本原因是应用程序收到了对caicon提供给MVC的favicon.ico的请求,而Ninject不知道如何处理它.

Ian Davis在很短的时间内修复了这个错误,并且还建议添加一个忽略路由以在开发时特别避免这个问题.只需将以下内容添加到路由配置中:

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!