Mat*_*ero 3 c# ninject asp.net-web-api 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在这样注册:
public static void RegisterModules(HttpConfiguration configuration, params ApplicationModule[] modules)
{
_resolver = new NinjectResolver(modules);
configuration.DependencyResolver = _resolver;
}
Run Code Online (Sandbox Code Playgroud)
一切似乎在一开始就很好.但是,在几分钟后(参见注释),我NinjectResolver处理掉了,因此NullPointerException在尝试解析类型时开始抛出(这是因为我_kernel = null在Dispose方法中设置).
解决此问题的一种方法是保持引用处于活动状态,并且在处理解析器时不将其设置为null.但我为什么要这样?
我的意思是,为什么我的解析器会像这样处理,从一分钟到另一分钟?在我的代码中没有任何地方我明确地处理它,所以它必须是Web Api框架为我做的.
注意:有时需要几分钟,有时只需几秒钟.这完全是随机的.
这个类被处理的原因是因为这个类有一个bug.您正在使用NinjectResolver两者作为解析器和作为作用域,并通过从方法返回NinjectResolver实例来返回实例.Web API基础结构每次请求调用该方法一次,Web API将在请求结束时调用.问题是你总是在发生这种情况时处理内核,这意味着在第一次请求之后你的内核将无法使用.IDependencyScopeBeginScope()BeginScope()IDependencyScope.Dispose()
快速解决方法是根本不处理内核.由于此内核将在整个应用程序的持续时间内存在,因此不排放内核通常不是问题.
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |