在 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 容器实例往往会在应用程序的整个生命周期内存在,因此只有在应用程序退出后才有意义地处理它。