2015-11-08 1 views
1

У меня есть следующие реализации 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) реализовано.

Я столкнулся с ошибкой Error loading Ninject component ICache, когда я добавил фабрику Ninject в один из моих классов WebAPI.

As per this answer/question Я понял, что использовал ту же реализацию, за исключением того, что я не удалял мое ядро, это было вызвано внедрением метода Dispose(bool disposing).

Когда я удалил реализацию, зависимости в моем контроллере WebAPI перестали вызывать ошибку, поэтому кажется, что проблема с внедрением метода Dispose(bool disposing).

Какова правильная реализация Dispose() для данного класса?

Позвонив следующее, чтобы создать элемент, который я называю выбрасывайте на:

IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 

I learned from this answer,, что только объект, который создан одноразовый ресурс должен позвонить распоряжаться, поэтому, возможно, нет никаких вещей, в пределах мой класс, который нуждается в утилизации

ответ

2

С resolutionRoot передается через конструктор, он может совместно использоваться другими объектами, и поэтому небезопасно утилизировать его изнутри NinjectScope.

Независимо от того, какой код был создан, объект resolutionRoot должен также избавиться от него, когда он больше не нужен.

В моем опыте, однако, один экземпляр контейнера DI имеет тенденцию находиться на протяжении всего срока службы приложения, поэтому может оказаться целесообразным избавиться от него после выхода приложения.

+0

Извините, вы совершенно правы ... это тот объект, который удаляется и проходит. Естественно, что это действительно неправильно распоряжаться этим. спасибо – Luke

Смежные вопросы