8

我在 MVC4 应用程序中使用 Ninject for DI 和 Ninject.MVC3 扩展,特别是版本 3.0.0.6。

阅读 Ninject wiki 上的文档,似乎使用创建的对象的生命周期InRequestScope实际上是由 ASP.NET 控制的,并且要正确清理一个应该注册OnePerRequestHttpModule。

type="Ninject.OnePerRequestModule"/>但是,由于找不到此文档,该文档似乎已过时。

另一方面,我最近阅读了一些似乎暗示NinjectHttpApplication已经处理OnePerRequest.

我的问题是 Ninject.Web.MVC 3.0 是否已经处理了这个问题,或者我是否仍然需要手动将 HttpModule 添加到我的“web.config”中。

我已将以下内容添加到我的配置中,并且一切似乎都在工作,尽管我完全不知道如何测试对象何时被销毁:

  <system.web>
    <httpModules>
      <add name="OnePerRequestModule" type="Ninject.Web.Common.OnePerRequestHttpModule"/>
    </httpModules>
    ...

我需要手动添加OnePerRequestHttpModule 还是 Ninject.Web.MVC 会为我处理这个?

4

1 回答 1

11

执行摘要:不,您不需要在web.config.

您可以通过以下方式手动进行完整性检查:

  • 绑定东西IDisposable .InRequestScope()
  • 将其添加到 Controller 的 ctor
  • 附加一个调试器,在里面放一个断点void Dispose()
  • 手动触发HttpRequest

如果你击中Dispose,它是 Ninject 射杀了熊(你将有一个调用堆栈来证明这一点)。

用什么线呢?Ninject.Web.CommonNuGet 包添加:

public static class NinjectWebCommon
{
    public static void Start()
    {
        ...
        DynamicModuleUtility.RegisterModule( typeof( OnePerRequestHttpModule ) );

DynamicModuleUtility来自Microsoft.Web.Infrastructure(并且对该Start方法的调用由以下驱动:

[assembly: WebActivator.PreApplicationStartMethod( typeof( App_Start.NinjectWebCommon ), "Start" )]

(来自WebActivatorNuGet 包)


医生 学究式地说道

要获得更具确定性的行为,您可以执行以下任何操作:

  1. ...

  2. 使用为您注册 OnePerRequestModule 的 Ninject.Web.Common 扩展。

...

可以注册

(我的重点)。我会更明确的...


顺便说一句,在回答这个问题的练习开始时,我没有特别的知识,只是Ninject Ninject.Web.Common我的一个应用程序的来源。

于 2013-04-03T12:04:52.307 回答