2010-06-02 104 views
1

我的類是從UnityContainer繼承(從Unity 2.0),這裏是源代碼:遞歸在Unity和Dispose模式實現

public class UnityManager : UnityContainer 
    { 

     private UnityManager() 
     { 
      _context = new MyDataClassesDataContext(); 
      // ... 
     } 


     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       _context.Dispose(); 
      } 

      base.Dispose(disposing); 
     } 

     private readonly CMCoreDataClassesDataContext _context; 
    } 

當Dispose方法被調用UnityManager類拖放到遞歸的實例。 ..爲什麼?據我所知base.Dispose應該只調用基類的Dispose方法...不是嗎?誰回電UnityManager的Dispose(bool)?如何防止呢?

謝謝。

回答

1

感謝妮可我找到了一個理由......謝謝。 但是如何在這種情況下處理容器?如果對UnityManager的實例調用「Dispose」,base.Dispose(true)將再次調用Dispose ....並且再次(遞歸將開始)。

要解決這個我添加了額外的私有變量BOOL _bDisposed:

protected override void Dispose(bool disposing) 
    { 
     if (_bDisposed) 
      return; 

     if (disposing) 
     { 
      _context.Dispose(); 
     } 
     _bDisposed = true; 

     base.Dispose(disposing); 
    } 

    private bool _bDisposed; 

這是「有效的C#」由比爾·瓦格納建議(如果我沒有任何錯誤)了「處置」模式實現

+2

你不應該註冊與自己的容器。詳細信息請參見http://unity.codeplex.com/Thread/View.aspx?ThreadId=46415#Post156036。 – 2010-06-03 11:40:32

+0

除了以下方面之外,沒有其他細節:從未註冊過容器。它已經爲你完成了(在Unity 1.2中是新的),所以你不會獲得任何東西,並且在處理時你會得到一個堆棧溢出。只需在對象中添加對IUnityContainer的依賴關係,它就可以工作。 但是這解釋了我很多。 :) 謝謝! – Budda 2010-06-04 20:50:14

1

您是否在容器中註冊UnityManager實例?如果是這樣,當容器被處理時它將由容器處理。

+0

哦,好的。謝謝! – Budda 2010-06-02 21:08:55