【问题标题】:What's the proper way to configure Ninject for an MVC3 application?为 MVC3 应用程序配置 Ninject 的正确方法是什么?
【发布时间】:2011-02-21 10:23:37
【问题描述】:

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

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

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

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

各有优缺点吗?

【问题讨论】:

    标签: asp.net-mvc-3 ninject webactivator


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      一些不错的链接:

      【讨论】: