2008-11-03 91 views
4

我有兩種形式,形式A和形式B.這些形式在外觀上必須有所不同,但它們共享很多邏輯。問題是這個邏輯與外觀相關聯(按鈕點擊驗證,事件被觸發等)。例如,我有一個名稱字段,當按下保存按鈕時,我需要觸發一個事件,導致父表單驗證記錄名稱以避免重複。兩種形式都需要這種邏輯,但是他們的保存按鈕位於不同的位置,並且發生錯誤時顯示的工具提示也需要出現在不同的位置。這只是一個例子,但是有誰知道我可以避免在這裏複製和粘貼代碼的方式?也許我錯過了一些顯而易見的東西...如何避免在兩個相似的WinForms上重複邏輯?

回答

12

您可以創建一個對象,其中包含以兩種形式表示的數據,並將驗證邏輯放入該對象中。表示層應該用輸入的數據填充該對象,要求對象驗證自己,然後以特定於表單的方式處理驗證錯誤。

3

如果通用邏輯與UI相關,則需要使用所需的邏輯創建自己的自定義窗體類(從Form類繼承)。那麼你需要做的就是在你的表單中繼承這個類。

如果通用邏輯與UI相關性較低,則創建一個內部類來封裝通用邏輯並從兩種形式中調用它。

3

您需要在2個視圖和共享模型之間添加一個控制器。這樣你只需要做:myController.save();而不必調用你的模型對象來保存它們在winform中。

+0

雖然這是一個正確的答案,但我不認爲這對於考慮問題的OP來說是非常有用的。一些使用WinForms的MVC,MVP和實現的鏈接可能會非常有幫助。 – cfeduke 2008-11-03 18:33:55

1

我可以想出很多方法來重構這些表單以共享邏輯。您可以結合使用以下一項或多項:

  1. 創建包含業務對象並添加表單之間共享的附加功能的UI特定「bean」對象。這個bean可以執行諸如創建工具提示,協助驗證,事件等等。
  2. 創建一個具有常用功能的助手類。推廣這兩種形式的邏輯來調用這個助手類來實現常用功能。
  3. 增強您的業務對象以進行驗證。我並不是說你的BO應該知道任何用戶界面,但他們可以/應該執行業務規則。這可能會將一些驗證邏輯從您的表單中拖到一個常見的位置。
  4. 創建特定於您正在使用的數據類型的自定義控件,並在這兩個窗體上使用這些控件。
1

您可能還想看看CSLA Framework,我在過去的項目中使用它非常成功,可以幫助減少不同用戶界面之間重複代碼的數量。它利用.NET的數據綁定功能,但我不認爲需要使用數據綁定才能充分利用框架。