为什么要处理ASP.NET Web Api的依赖关系解析器?

时间:2015-07-16 03:36:16

标签: 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(这是因为我正在设置{{在_kernel = null方法中1}}。

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

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

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

1 个答案:

答案 0 :(得分:5)

此类被处置的原因是因为此类中存在错误。您正在使用NinjectResolver作为解析程序和范围,并且NinjectResolver实例将IDependencyScope实例作为BeginScope()返回,方法是从BeginScope()方法返回。 Web API基础结构每次请求调用IDependencyScope.Dispose()方法,并且当请求结束时,Web API将调用Worksheets("Sheet1").Range("H2").PasteSpecial xlPasteValuesAndNumberFormats 。问题是你总是在发生这种情况时处理内核,这意味着在第一次请求之后你的内核将无法使用。

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