为什么要处置 ASP.NET Web Api 的依赖项解析器?
Why is ASP.NET Web Api's Dependency Resolver being disposed?
我有一个习惯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;
}
一开始似乎一切正常。但是,几分钟后(参见 NOTE)我的 NinjectResolver
被处理掉,因此在尝试解析类型时开始抛出 NullPointerException
(这是因为我在 Dispose
方法中设置 _kernel = null
。
解决此问题的一种方法是使引用保持活动状态,而不是在处理解析器时将其设置为 null。但我为什么要这么做?
我的意思是,为什么我的解析器一分钟到另一分钟就这样被处理掉?我没有在我的代码中明确地处理它,所以它必须是 Web Api 框架为我做的。
注意:有时需要几分钟,有时只需几秒钟。完全随机。
这个class被处理的原因是这个class有一个错误。您正在使用 NinjectResolver
作为解析器和范围,并且通过从 BeginScope()
方法返回 NinjectResolver
实例作为 IDependencyScope
返回它。 Web API 基础设施每次请求都会调用 BeginScope()
方法一次,Web API 将在请求结束时调用 IDependencyScope.Dispose()
。问题是发生这种情况时你总是处理内核,这意味着你的内核在第一次请求后将无法使用。
一个快速的解决方法是根本不处理内核。由于此内核将在整个应用程序期间存在,因此不处理内核通常不是问题。
我有一个习惯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;
}
一开始似乎一切正常。但是,几分钟后(参见 NOTE)我的 NinjectResolver
被处理掉,因此在尝试解析类型时开始抛出 NullPointerException
(这是因为我在 Dispose
方法中设置 _kernel = null
。
解决此问题的一种方法是使引用保持活动状态,而不是在处理解析器时将其设置为 null。但我为什么要这么做?
我的意思是,为什么我的解析器一分钟到另一分钟就这样被处理掉?我没有在我的代码中明确地处理它,所以它必须是 Web Api 框架为我做的。
注意:有时需要几分钟,有时只需几秒钟。完全随机。
这个class被处理的原因是这个class有一个错误。您正在使用 NinjectResolver
作为解析器和范围,并且通过从 BeginScope()
方法返回 NinjectResolver
实例作为 IDependencyScope
返回它。 Web API 基础设施每次请求都会调用 BeginScope()
方法一次,Web API 将在请求结束时调用 IDependencyScope.Dispose()
。问题是发生这种情况时你总是处理内核,这意味着你的内核在第一次请求后将无法使用。
一个快速的解决方法是根本不处理内核。由于此内核将在整个应用程序期间存在,因此不处理内核通常不是问题。