在 IDependencyScope 中处置托管资源的正确方法是什么
What is the correct way to Dispose of managed resources in IDependencyScope
我有以下 IDependencyScope
的实现:
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
~NinjectScope()
{
this.Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
IDisposable disposable = (IDisposable)this.resolutionRoot;
if (disposing)
{
// Free managed resources
if (this.resolutionRoot != null)
{
disposable.Dispose();
this.resolutionRoot = null;
}
}
}
}
如您所见,它已实现 Dispose(bool disposing)
。
我在将 Ninject 工厂添加到我的 WebAPI classes 之一时遇到错误 Error loading Ninject component ICache
。
As per this answer/question 我意识到我使用的是相同的实现,除了它不是我的内核被处理,它是由 Dispose(bool disposing)
方法的实现引起的。
当我删除实现时,我的 WebAPI 控制器中的依赖项停止导致错误,因此似乎 Dispose(bool disposing)
方法的实现导致了问题。
对于这个特定的 class,Dispose()
的正确实现是什么?
通过调用以下命令来创建我调用处置的项目:
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
I learned from this answer, 只有创建一次性资源的对象才应该调用处置,所以也许我的 class 中没有任何东西需要处置
由于 resolutionRoot
是通过构造函数传入的,它可能被其他对象共享,因此从 NinjectScope
.
内部处理它是不安全的
无论什么代码创建了那个 resolutionRoot
对象,当它不再需要时也应该再次处理它。
不过,根据我的经验,单个 DI 容器实例往往会在应用程序的整个生命周期内存在,因此只有在应用程序退出后才有意义地处理它。
我有以下 IDependencyScope
的实现:
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
~NinjectScope()
{
this.Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
IDisposable disposable = (IDisposable)this.resolutionRoot;
if (disposing)
{
// Free managed resources
if (this.resolutionRoot != null)
{
disposable.Dispose();
this.resolutionRoot = null;
}
}
}
}
如您所见,它已实现 Dispose(bool disposing)
。
我在将 Ninject 工厂添加到我的 WebAPI classes 之一时遇到错误 Error loading Ninject component ICache
。
As per this answer/question 我意识到我使用的是相同的实现,除了它不是我的内核被处理,它是由 Dispose(bool disposing)
方法的实现引起的。
当我删除实现时,我的 WebAPI 控制器中的依赖项停止导致错误,因此似乎 Dispose(bool disposing)
方法的实现导致了问题。
对于这个特定的 class,Dispose()
的正确实现是什么?
通过调用以下命令来创建我调用处置的项目:
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
I learned from this answer, 只有创建一次性资源的对象才应该调用处置,所以也许我的 class 中没有任何东西需要处置
由于 resolutionRoot
是通过构造函数传入的,它可能被其他对象共享,因此从 NinjectScope
.
无论什么代码创建了那个 resolutionRoot
对象,当它不再需要时也应该再次处理它。
不过,根据我的经验,单个 DI 容器实例往往会在应用程序的整个生命周期内存在,因此只有在应用程序退出后才有意义地处理它。