2014-07-09 31 views
-2

全部:在我自己的類中包裝存在事件的設計模式

此問題來自我目前正在工作的C#項目。在解決方案中,它包含三個項目,一個是UI項目,另一個是接口項目,第三個是組件項目。我的解決方案的基本思想是UI項目可以動態加載繼承接口項目中定義的接口的組件DLL。在界面項目中,我定義了兩個類,一個是UI項目用於動態加載DLL的界面,該界面定義了組件對象中的所有曝光實體。除此接口外,還有另一個抽象組件核心類繼承了公共接口,它包含了實際組件對象中的所有常見操作。我在下面繪製一個情節來描述我的解釋。

「UI類--->接口< ---抽象組件核心< ---實際組件」

而且在我的設計,我用C#BackgroundWorker的抽象組件核心對象。而BackgroundWorker包含兩個事件ProgressChanged和RunWorkerCompleted。在我的設計理念中,這兩個事件應該由UI類註冊。例如,UI組件可以在組件的BackgroundWorker的進度更改或操作完成時註冊其操作。另一件事是我不想將組件Core中的BackgroundWorker對象暴露給UI類,所以BackgroundWorker對象在抽象組件核心中定義,而不是在接口中定義。所以在我的原始設計中,我在接口中創建了兩個事件,它接受與BackgroundWorker的兩個事件相同的事件處理程序。如下:

event EventHandler<ProgressChangedEventArgs> ProcessChanged; 
event EventHandler<RunWorkerCompletedEventArgs> RunWorkerCompleted; 

而在稍後的一些地方,我將這兩個事件處理程序分配給BackgroundWorker的實際事件。代碼如下:

mBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler (this.ProcessChanged); 
mBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (this.RunWorkerCompleted); 

但我不喜歡這種設計。因爲組件的用戶(這裏是UI類)將其事件處理程序分配給組件的事件,並且它是真實的操作,組件將向BackgroundWorker的事件處理程序添加(+ =)此事件處理程序。因此,如果UI一次又一次地運行,BackgroundWorker將具有多個相同的事件處理程序。我的想法是:1-BackgroundWorker的事件只能包含一個事件處理程序; 2 - 當用戶將組件事件處理程序分配給組件核心自己的事件時,它可以同時將此事件處理程序傳輸到BackgroundWorker的事件;

任何人都可以給我一些可行的設計理念嗎?謝謝!

回答

0

我找到了一個解決方案來解決我的問題。我可以使用添加和刪除關鍵字來爲我的組件核心類中的客戶定義我的事件訪問器。代碼如下:


     public virtual event ProgressChangedEventHandler ProcessChanged 
     { 
      add 
      { 
       lock (mEventLock) { mBackgroundWorker.ProgressChanged += value; } 
      } 
      remove 
      { 
       lock (mEventLock) { mBackgroundWorker.ProgressChanged -= value;} 
      } 
     } 

所以這可以解決我的問題。分配給組件核心事件的用戶可以立即將事件分配給BackgroundWorker的相關事件。這就是我要的。所以在我上面的問題中,代碼的兩部分可以集成到代碼的一部分。

相關問題