Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在IDependencyScope中处置托管资源的正确方法是什么_Asp.net Mvc_Dependency Injection_Ninject_Idisposable - Fatal编程技术网

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);