Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
C# 使用Ninject处理或不处理可注入实例_C#_Dispose_Idisposable_Disposable - Fatal编程技术网

C# 使用Ninject处理或不处理可注入实例

C# 使用Ninject处理或不处理可注入实例,c#,dispose,idisposable,disposable,C#,Dispose,Idisposable,Disposable,我有以下代码块用于在解决方案中配置Ninject: public class NinjectDependencyScope : IDependencyScope { private IResolutionRoot resolver; internal NinjectDependencyScope(IResolutionRoot resolver) { Contract.Assert(resolver != null

我有以下代码块用于在解决方案中配置Ninject:

public class NinjectDependencyScope : IDependencyScope
    {
        private IResolutionRoot resolver;

        internal NinjectDependencyScope(IResolutionRoot resolver)
        {
            Contract.Assert(resolver != null);

            this.resolver = resolver;
        }

        public object GetService(Type serviceType)
        {
            if (resolver == null)
            {
                throw new ObjectDisposedException("this", "This scope has already been disposed");
            }

            return resolver.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            if (resolver == null)
            {
                throw new ObjectDisposedException("this", "This scope has already been disposed");
            }

            return resolver.GetAll(serviceType);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                IDisposable disposable = resolver as IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }

                resolver = null;
            }
        }

我知道Autofac就是这样。您不必担心如何处理已从Autofac解析的类,因为它将为您调用dispose。我很确定Ninject也会类似。

我对Ninject的经验是,当涉及到实现IDisposable的托管对象时,您不必太担心,因为它们最终会被处理掉

但是,如果您有一次性对象,这些对象是围绕非托管对象的包装器,例如围绕Office Interop应用程序对象的C类,那么您需要更加小心,因为这些对象最终将由Ninject处理,但您无法确定何时处理

有时,您需要快速清理这些资源,因为代码的其他部分可能依赖于已清理的这些资源。例如,您可能正在“使用”其中一个对象来创建工作簿,然后不久需要重命名工作簿,此时您需要释放应用程序对象

在这种情况下,我可能会违反DI原则,在使用对象时只是更新它,然后自己处理它


我想您可以自己测试所有这些,这样您就知道哪些对象适合与Ninject一起使用,哪些不适合,并相应地进行测试。

如果该类或从其派生的类都不使用非托管资源,则以下模拟实现是正确的-这种情况很少发生:

public void Dispose() {
    IDisposable disposable = resolver as IDisposable;
    if (disposable != null) {
        disposable.Dispose();
    }
    resolver = null;
}
有关详细信息,请参阅

它是可选的,因为解析程序将被正确地处理掉,即只有在您特别需要控制自己释放由解析程序what?管理的资源时才需要

public void Dispose() {
    IDisposable disposable = resolver as IDisposable;
    if (disposable != null) {
        disposable.Dispose();
    }
    resolver = null;
}