不处理InRequestScope的Ninject依赖项

时间:2014-05-08 12:42:56

标签: c# ninject asp.net-mvc-5

之前已经多次询问过这个问题,但对于我的生活,我无法让Ninject处理InRequestScope的服务。我查看了所有答案,其中大部分都告诉用户使用Ninject.MVC3OnePerRequestHttpModule。我正在使用Ninject.MVC5

以下是如何到达我的位置:

使用VS2013

  • 添加新项目(ASP.NET Web应用程序)
  • 选择MVC并且不进行身份验证
  • 将NuGet引用添加到Ninject.MVC5
  • 为项目添加界面:

    public interface IBlah : IDisposable
    {
        void DoSomething();
    }
    
  • 为界面添加实现:

    public class Blah : IBlah
    {
        private static int _count;
    
        public Blah()
        {
            _count++;
            Debug.WriteLine("Blah nr {0} created", _count);
        }
    
        public void DoSomething()
        {
            Debug.WriteLine("DoSomething called");
        }
    
        public void Dispose()
        {
            _count--;
            Debug.WriteLine("Blah disposed. Still left {0}", _count);
        }
    }
    
  • 打开家庭控制器并添加以下ivar和构造函数:

    private readonly IBlah _blah;
    
    public HomeController(IBlah blah)
    {
        _blah = blah;
    }
    
  • 将以下内容添加到Index操作:

    _blah.DoSomething();
    
  • 打开NinjectWebCommon并将以下行添加到RegisterServices方法

    kernel.Bind<IBlah>().To<Blah>().InRequestScope();
    
  • 调试项目并查看您将看到的Debug输出(在系统消息中)

    "Blah nr 1 created"
    "DoSomething called"
    
  • 在浏览器中点击刷新,您将看到

    "Blah nr 2 created"
    "DoSomething called"
    
  • 处理时没有任何输出,Dispose中的断点也永远不会被击中。

我可以在此处下载我的测试解决方案:http://www.upload.ee/files/4044477/NinjectTest.zip.html

我到底做错了什么???


更新2014年5月15日

现在有一个新版本(3.2.2)的Ninject.Web.Common包可用于NuGet修复了该错误。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

一篇好文章(忽略名称),涵盖了原因:

http://www.mistergoodcat.com/post/How-Ninject-inadvertently-made-the-case-for-SOLID