9

我昨晚刚刚在一个新项目上做了文件-> 新项目。啊,绿色田野的气味。

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

无论如何,我遵循了我能找到的最新建议;我在 MVC2 项目中引用了 DLL,然后开始研究 Global.asax.cs。首先我让它继承自 NinjectHttpApplication。我删除了 Application_Start() 方法,并改写了 OnApplicationStarted() 。这是那个方法:

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

而且我也听从了 VS 的建议,实现了 CreateKernel 方法:

protected override Ninject.IKernel CreateKernel() 
{ 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    return new StandardKernel(); 
} 

就这些。没有对项目进行其他修改。

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

  • 像上面一样运行它。

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

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

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

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

(并将评论放回 CreateKernel() 中的评论)

导致行为与第 1 点完全相同。

因此,为了避免永远继续下去 - 是否有关于如何使用 Ninject 2(两个非 beta 版本)设置 MVC 2 项目以获得 Ninject 提供的控制器的确切分步指南?当然,然后我将开始提供一些实际的注入内容(如 ISession 对象和存储库、记录器等),但我想我会先让这个工作。

任何帮助将不胜感激!

(也发布到 Ninject Google Group)

4

1 回答 1

10

我觉得回答我自己的问题很肮脏,但为了任何可能陷入这个问题的人的利益......

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

Ian Davis 在极短的时间内解决了这个问题,并且还建议在开发过程中添加一个忽略路由来避免这个问题。只需将以下内容添加到您的路由配置中:

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

希望这对某人有帮助!

于 2010-03-28T14:55:13.947 回答