此問題來自我目前正在工作的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的事件;
任何人都可以給我一些可行的設計理念嗎?謝謝!