Asp.net mvc 在IDependencyScope中处置托管资源的正确方法是什么
我有以下Asp.net mvc 在IDependencyScope中处置托管资源的正确方法是什么,asp.net-mvc,dependency-injection,ninject,idisposable,Asp.net Mvc,Dependency Injection,Ninject,Idisposable,我有以下idependencycoscope的实现: public class NinjectScope : IDependencyScope { protected IResolutionRoot resolutionRoot; public NinjectScope(IResolutionRoot kernel) { resolutionRoot = kernel; } public object GetService(Type s
idependencycoscope
的实现:
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,因此我的类中可能没有任何东西需要处理因为
resolutionRoot
是通过构造函数传入的,它可能会被其他对象共享,因此,从NinjectScope
内部处置它是不安全的
无论创建了哪个resolutionRoot
对象的代码,当不再需要它时,都应该再次处理它
但是,根据我的经验,单个DI容器实例往往在应用程序的生命周期内都存在,因此只有在应用程序退出后才有意义处置它。对不起,你说得很对。。。正是该对象被处置并传入。当然,在那里处理这些确实是错误的。非常感谢。
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);