c# - 无法让 Ninject 在请求范围内处理对象

标签 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 Identity)
  • 我通过 nuget 安装 Ninject.MVC5 包 (install-package Ninject.MVC5)
  • 我将以下类添加到我的应用程序中:

    公共(public)类 SomeDisposable : IDisposable { 公共(public)无效处置() { System.Diagnostics.Debug.WriteLine("测试"); }

  • 我在 NinjectWebCommon RegisterServices 方法中添加了以下绑定(bind)

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

  • 我将 SomeDisposable 类型的对象添加到 Home Controller

    public HomeController(SomeDisposable some) {

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

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

我已经阅读了很多问题,包括这个 - 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 与此有关,但我不知道如何调试它或如何修复它。有什么建议吗?

最佳答案

对象未被释放是 3.2.2 版之前 Ninject.Web.Common 中的一个问题,如此处所述:InRequestScope is failing to dispose objects

由于您一直在通过 nuget 安装 Ninject,因此您可能安装了最旧的支持依赖项。这可以通过使用来避免:

Install-Packages Ninject.MVC5 -DependencyVersion Highest

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

关于c# - 无法让 Ninject 在请求范围内处理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312389/

相关文章:

javascript - asp.net mvc 中的对象数组数据始终为 null

c# - AssemblyName.ReferenceMatchesDefinition 如何工作?

C#,如何使用处理程序删除复制粘贴

c# - 通过局部 View MVC3 传递模型

asp.net - 从单独的配置文件中读取设置

asp.net - 插入图像并更新它(如果存在)

asp.net-mvc - MVC 5 脚手架不能为多对多关系添加选择列表吗? (添加脚手架 - 带有 View 的 MVC 5 Controller ,使用 Entity Framework )

asp.net-mvc - 日期时间字段上的 ModelState 出现问题

c# - 在更新面板中回发后,Bootstrap 工具提示消失

.net - ASP.NET Core 3.0 端点路由和自定义中间件