我正在使用这篇文章让 ninject 与 Asp.Net WebApi 一起工作
http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/
这会破坏所有范围,例如 InSingletonScope
编辑:答案在评论中
好的,我主要想通了。问题是 NinjectResolver 的 BeginScope 方法返回一个新的 NinjectScope,将 _kernel.BeginBlock() 传递给构造函数。这会将实例从在其绑定中声明的范围重新关联到新的激活块。
因此,曾经限定为请求的内容现在限定为激活块。
为了解决这个问题,我像这样更改了 NinjectResolver:
公共 IDependencyScope BeginScope() { return new NinjectScope(_kernel); }
然后,为了防止 NinjectScope 处理内核本身,我注释掉了 NinjectScope 的 Dispose 块中的所有内容。
据我所知,这应该不会有太大影响。内置的缓存和收集机制将像往常一样工作,轮询 GC 并自动在缓存中处理实例。
我认为这里问题的核心是 WebApi 本身正在尝试完成每个请求范围管理的工作,但 Ninject 已经有办法完成这项工作。这两种不同的作用域机制似乎并不和谐。