c# - 为什么要处理 ASP.NET Web Api Dependency Resolver?

标签 c# asp.net-web-api ninject owin

我有一个自定义的 IDependencyResolver:

internal class NinjectResolver : IDependencyResolver
{
     private IKernel _kernel;

     internal NinjectResolver(params ApplicationModule[] modules)
     {
          _kernel = new StandardKernel(modules);
     }

     public IDependencyScope BeginScope()
     {
          return this;
     }

     public object GetService(Type serviceType)
     {
          return _kernel.TryGet(serviceType);
     }

     public IEnumerable<object> GetServices(Type serviceType)
     {
          return _kernel.GetAll(serviceType);
     }

     protected void Dispose(bool disposing)
     {
          if(disposing)
          {
               if(_kernel != null && !_kernel.IsDisposed)
               {
                     _kernel.Dispose();
                     _kernel = null;
               }
          }
     }

     public void Dispose()
     {
         Dispose(true);
         GC.SuppresFinalize(this);
     }
}

我是这样注册的:

public static void RegisterModules(HttpConfiguration configuration, params ApplicationModule[] modules)
{
     _resolver = new NinjectResolver(modules);
     configuration.DependencyResolver = _resolver;
}

一开始似乎一切正常。然而,几分钟后(参见 注意)我的 NinjectResolver 被处理掉,因此在尝试解析类型时开始抛出 NullPointerException(这是因为我在 Dispose 方法中设置了 _kernel = null

解决此问题的一种方法是保持引用处于事件状态,而不是在处理解析器时将其设置为空。但我为什么要这么做?

我的意思是,为什么我的解析器从一分钟到另一分钟都这样处理?我没有在我的代码中明确地处理它,所以它一定是 Web Api 框架为我做的。

注意:有时需要几分钟,有时只需几秒钟。这是完全随机的。

最佳答案

这个类被处置的原因是因为这个类中有一个错误。您正在使用 NinjectResolver 作为解析器和范围,并且通过从 BeginScope 返回 NinjectResolver 实例作为 IDependencyScope () 方法。 BeginScope() 方法由 Web API 基础结构在每次请求时调用一次,Web API 将在请求结束时调用 IDependencyScope.Dispose()。问题是当发生这种情况时,您总是处置内核,这意味着您的内核在第一次请求后将无法使用。

一个快速的解决方法是根本不处理内核。由于此内核将在整个应用程序的持续时间内存在,因此不处置内核通常不是问题。

关于c# - 为什么要处理 ASP.NET Web Api Dependency Resolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444952/

相关文章:

c# - 将 WebService 添加到 Silverlight (3.0) 时引用不明确?

c# - 无法访问 jarfile (Xamarin Visual Studio 15.3.3)

asp.net-web-api - 多个 CORS 适用于 GET 但不适用于具有飞行前请求 Web api 2 的 PUT/POST

c# - Ninject:单例绑定(bind)语法?

asp.net - Ninject、ASP.NET 和自定义控件

javascript - 如何使用 jquery 隐藏/显示 <panel>?

c# - 如何从流中读取 Access 文件 (.accdb)?

asp.net - 如何从 ASP.NET Web API 方法内部找到声明的内容?

c# - oAuth 2.0 API 使用 C#

wpf - MVVM:依赖注入(inject)和按需创建 ViewModel