6

我已经阅读了几篇关于为 MVC3 项目设置 Ninject 的文章。

有人说您的 Global.asax.cs 应该从NinjectHttpApplication继承,其他人在通过 Application_Start()构造StandardKernel时注册模块。

我个人使用了 NuGet,它以不同的方式创建了一个AppStart_NinjectMVC3类,并使用它启动它

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart_NinjectMVC3), "Start")]

每个人有什么优点/缺点吗?

4

2 回答 2

6

在过去的几天里,Ian 和我一直在忙于这个话题。Ninject.Web.Mvc并且Ninject.MVC3已经合并。仍然有两种方法可以派生NinjectHttpApplication或安装 nuget 包。但是现在它们基于相同的代码,因此它们具有相同的功能。有关更多详细信息,请参阅我的博文:

http://www.planetgeek.ch/2011/02/22/ninject-mvc3-and-ninject-web-mvc3-merged-to-one-package/

于 2011-02-22T21:04:05.497 回答
2

我一直在寻找同一个问题的答案,但我自己似乎找到了一个不错的答案。顺便说一句:我是一名 MVC、Ninject、DI n00b,所以如果我离开这里,请随意向我开枪,但我想我已经很清楚了。

System.Web 中已经存在“PreApplicationStartMethod”属性,甚至可以在 Application_Start() 之前运行方法。这意味着它对 DI 非常有用,因为您可能已经需要在 Application_Start() 中开始注入,并且通过使用 PreApplicationStartMethod,您可以将注入的东西排除在 Application_Start() 之外,并确保它是第一个开始的时间您的应用程序启动。

问题是微软只允许用这个属性标记一种方法,他们承认这是一个设计缺陷。这就是为什么他们创建了 WebActivator 类来规避这个缺点。

允许将多个方法标记为 PreApplicationStartMethod 的好处之一是可以将需要初始化的 NuGet 包插入到您的应用程序中,而无需触及现有代码,只需使用 PreApplicationStartMethod 属性的 WebActivator 版本标记某种初始化方法即可。

这种方法与在 Application_Start() 中构建内核几乎相同,但 Ninject 的东西更早开始。

通过覆盖 NinjectHttpApplication,您可以让 Ninject 为您执行许多常见的与 MVC 相关的绑定工作,例如绑定 HttpContext 等。据我所知,使用 WebActivavtor/Application_Start() 方法您必须自己执行此操作。

一些很好的链接:

于 2011-02-22T11:06:58.340 回答