2013-10-21 66 views
1

處置注射比如我有我的解決方案配置Ninject下面的代碼塊:處置或不使用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; 
      } 
     } 

我的看法是,這裏使用的一次性模式,時並不需要..

IDependencyScope是IDisposable,但我應該只清理IDisposable成員,如果我正在構建它們,但注入的解析器在構造函數中並不是由我的類擁有(創建),並且IResolutionRoot不會從/實現IDisposable中派生/執行...

是我在這裏?

(檢查this文章關於IDisposable模式供參考)

(編輯): 這其實是一個基類,通過下面的類使用的,所以在這裏卸下了IDisposable的實現不能做..

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
    { 
     private IKernel kernel; 

     public NinjectDependencyResolver(IKernel kernel) 
      : base(kernel) 
     { 
      this.kernel = kernel; 
     } 

     public IDependencyScope BeginScope() 
     { 
      return new NinjectDependencyScope(kernel.BeginBlock()); 
     } 
    } 

回答

0

我知道Autofac就是這種情況。您不必擔心從Autofac中解決的類的處置,因爲它會爲您調用處置。我很確定Ninject會是相似的。

0

我對Ninject的經驗是,當涉及到實現IDisposable的管理對象時,您不必擔心這些事情,因爲它們最終會被丟棄。但是,如果您擁有圍繞非託管對象(如C#類環繞Office Interop應用程序對象)的一次性對象,則需要特別小心,因爲這些對象最終將由Ninject處理掉,但你無法可靠地說出什麼時候。

有時您需要快速清理這些資源,因爲代碼的其他部分可能依賴於已被清理的資源(例如,您可能正在'使用'其中一個對象來創建工作簿,然後需要重新命名工作簿後,你需要釋放Application對象)。

在這種情況下,我可能會違反DI原則,並且在我使用它時只是新增對象,並且自己處理它。

我想你自己測試所有這些,以便知道哪些對象適合與Ninject一起使用,哪些不適合並相應地這樣做。

0

以下miminal執行力度是正確的(前提是沒有這個類或派生從它使用的非託管資源類 - 這是很少的情況下):

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

詳見Minimal IDispose implementation

這是可選的,因爲解析器將正確地處理掉 - 即只有當您特別需要控制自己釋放由resovler管理的資源(什麼?)時才需要。