2012-01-20 61 views
3

如何在下列情況下構建代碼:你在哪裏放置驗證邏輯?

若干業務對象(例如Person,House等)以及它們之間需要驗證用戶輸入(來自文本框)。但願進去之一:

  1. 每個業務對象
  2. 的代碼隱藏的WinForms
  3. 一個單獨的(靜態?)類。

感謝

回答

2

每個業務對象。我經典地使每個實現了一個IValidator接口,它爲對象吐出所有驗證錯誤。

4

我在這種情況下支持的一種非常廣泛使用的方法是引入視圖模型的概念:聚合所有要在表單中顯示的數據的類,並指定(通過屬性或其他機制)應該對這些數據執行什麼類型的驗證。

這種方法有幾個好處,其中包括:

  • 從模型去耦驗證邏輯(或許還有你今天要強制執行,但不是在你的數據本身所固有的驗證場景);通過這種方式,您可以爲相同業務對象的不同部分定義不同的驗證場景(例如,在業務邏輯的某些部分,每個人必須擁有配偶,但擁有配偶並不是固有屬性)每個人無處不在)
  • 將驗證與表示邏輯(您的視圖的代碼隱藏)解耦;通過這種方式,您不必強制將您的演示文稿行爲與業務對象驗證結合起來
  • 驗證代碼被隔離,並且其每個部分僅針對特定類型的驗證;通過這種方式,驗證碼可以在任何適用的應用程序中重複使用

執行驗證的實際代碼通常位於單獨的驗證類中;您的視圖模型只會規定每條驗證應該如何應用於每條數據。

+2

我會對此建議,ViewModel的目的是爲視圖的適配器,以便它可以附加到模型。也就是說,在WinForms中,你通常沒有ViewModel。 ViewModel儘管名稱是* view *的一部分,而不是模型。因此我會避免將驗證邏輯放在那裏。 – vidstige

+0

有趣的問題!這確實很容易在模型中處理。也許超出了這個評論領域的範圍,但是例如這個政策可以被注入到ViewModel中。這樣你有一個ViewModel,因爲你有一個窗體,ViewModel有兩個*模型。 – vidstige

0

業務對象。原因是你希望你的驗證規則是可測試的。如果規則很重要,你會想要用測試覆蓋它們,如果它們不是的話 - 不要首先實現它們。將這種極端情況提供給代碼,其中代碼隱藏非常薄,並且幾乎沒有任何邏輯。這是需要的東西。