我需要在Ninject.Web.MVC 3.0中注册Ninject.OnePerRequestModule吗?

时间:2013-04-03 03:22:56

标签: ninject ninject.web.mvc

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

阅读Ninject维基上的documentation,看来用InRequestScope创建的对象的生命周期实际上是由ASP.NET控制的,要正确清理一个,应该注册OnePerRequest HttpModule

然而,由于无法找到type="Ninject.OnePerRequestModule"/>,因此此doco看起来已过时。

另一方面,我最近阅读了一些bits,似乎表明NinjectHttpApplication已经与OnePerRequest打交道。

我的问题是Ninject.Web.MVC 3.0是否已经处理过这个问题,或者我是否还需要手动将HttpModule添加到我的'web.config'。

我已将下面的内容添加到我的配置中,一切似乎都有效,但我根本不知道如何测试对象何时被销毁:

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

我是否需要手动添加OnePerRequest HttpModule或Ninject.Web.MVC为我处理这个问题?

1 个答案:

答案 0 :(得分:10)

执行摘要:不,您不需要在web.config中执行任何操作。

您可以通过以下方式手动进行健全检查:

  • 绑定某些内容IDisposable .InRequestScope()
  • 将其添加到控制器的控制器
  • 附加调试器,在void Dispose()
  • 中放置一个断点
  • 手动触发HttpRequest

如果你点击了Dispose,那就是射击熊的Ninject(并且你将有一个调用堆栈来证明它)。

它用什么电线? Ninject.Web.Common NuGet包添加:

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" )]

(来自WebActivator NuGet包)


迂腐地说,the docco 说:

  

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

     
      
  1. ...

  2.   
  3. 使用Ninject.Web.Common扩展程序为您注册OnePerRequestModule。

  4.   

...

  

可以注册

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


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