我昨晚刚刚在一个新项目上做了文件-> 新项目。啊,绿色田野的气味。
我正在使用刚刚发布的 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)