无法让Ninject在Request Scope中处置对象

时间:2014-12-05 09:13:46

标签: c# asp.net asp.net-mvc asp.net-web-api ninject

无论我做什么,我似乎无法让Ninject在带有Web API的ASP.NET MVC应用程序中处理请求范围内的对象。

我在做什么:

  • 使用Visual Studio 2013创建一个新的ASP.NET Web应用程序。我选择MVC模板并向其添加Web API(默认情况下它还包含ASP.NET标识)
  • 我通过nuget安装Ninject.MVC5软件包(install-package Ninject.MVC5)
  • 我在应用程序中添加了以下类:

    公共类SomeDisposable:IDisposable {     public void Dispose()     {         System.Diagnostics.Debug.WriteLine("测试&#34);     } }

  • 我在NinjectWebCommon RegisterServices方法中添加以下绑定

    kernel.Bind()ToSelf()InRequestScope();

  • 我将一个SomeDisposable类型的对象添加到Home控制器

    public HomeController(SomeDisposable some) { }

  • 我运行应用程序并在HomeController构造函数和SomeDisposable类的Dispose方法中放置一个断点。控制器接收一个对象(可能来自Ninject),页面加载但从不调用Dispose方法

  • 此时事情已经破裂,但我添加了一个Web API控制器,安装Ninject.WebApi打包并使用WebAPI控制器重复实验,我得到了相同的结果。

我已经阅读了很多问题,包括这一个问题 - Ninject doesn't call Dispose on objects when out of scope和Ninject文档https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope,它们都表明由于Ninject.Web.Common包含OnePerRequestHttpModule的注册(是的它在那里)处理应该工作,但它没有。我还尝试在web.config中添加PerRequest模块,并收到一条错误消息,说我无法在集成模式下使用此部分。

此时我迷路了。我怀疑集成模式或OWIN与此有关,但我不知道如何调试它或如何解决它。有什么建议吗?

1 个答案:

答案 0 :(得分:7)

在版本3.2.2之前Ninject.Web.Common中没有处理的对象是一个问题,如下所述:InRequestScope is failing to dispose objects

正如您通过nuget安装Ninject一样,您可能安装了最早的受支持的依赖项。使用以下方法可以避免这种情况:

Install-Packages Ninject.MVC5 -DependencyVersion Highest

请确认您使用的是所有Ninject软件包的当前版本。