2010-03-02 88 views
7

Business Objects的驗證是一個常見問題,但有一些解決方案可以解決這個問題。業務對象或實體應該自我驗證嗎?

其中一種解決方案是使用獨立的NHibernate.Validator框架,這是一個基於屬性的驗證框架。

但我正面臨着概念關注。像NH.Validator這樣的屬性驗證器非常棒,但驗證只在會話中的save-update-delete時執行。

所以我想知道是否業務對象不應該自我驗證,以保持自己的完整性和一致性?

回答

10

恕我直言 - 有2個步驟驗證的是有效所需的業務對象(BO)/實體:

第一步:BO /實體自我驗證 - 在此,我們只有在檢查實體的狀態是否有效F.Ex .:如果設置了郵政編碼,那麼它是否具有有效字符&具有有效長度等,以形成BO /實體等級驗證。但是,除了這種驗證級別之外,我們無法說BO/Entity在您的業務領域和/或存儲庫中是有效的。通常BO /實體將能夠執行這種驗證水平。

第二步:驗證上下文 - 在這方面,我們需要驗證,如果BO /實體是它被持久化存儲庫的範圍內有效。例如:郵政編碼是否對訂單所在的國家/地區有效 對於此驗證,可能需要涉及當前上下文中的一些或全部實體以確保BO /實體已驗證。

因此,爲了保持實體的純淨性,您需要將驗證分爲以下兩個步驟 - 一個由實體本身執行&第二個由persistence /與實體一起工作的存儲庫執行。

HTH。

+0

這兩個步驟的分離很有意思。雖然我從來沒有真正想過這種方式,但是我在不知情的情況下部分使用這種方法。儘管如此,我還試圖將自我驗證與實體分開。我解釋了我是如何在這裏使用驗證應用程序塊執行此操作的:http://stackoverflow.com/questions/2258513/validation-framework-in-net-that-c​​an-do-edits-between-fields/2259062#2259062。 – Steven 2010-03-02 09:28:47

6

雖然他們並不總是可以自我驗證。如果您輸入「無效的」郵政編碼怎麼辦?您可以驗證郵政編碼需要採用特定的格式,但如果您希望郵政編碼「有效」,即「現有並匹配城市」,該怎麼辦?或者如果您只接受來自特定地區代碼的電話號碼,並且有效代碼列表位於由法律部門維護的數據庫中,該怎麼辦?

如果您可以執行語義驗證,那很好,可以進入業務類。但是,通常情況下,您可能需要額外的驗證,這些驗證根本無法由業務類本身來處理,但需要由與數據庫和其他外部服務進行交談的類來處理。

+0

+1你說得對。在我的解釋中,我談論可以由實體進行自我檢查的驗證。 – Javier 2010-03-02 00:53:09

+2

我同意。我更願意將我的驗證邏輯與業務實體分開。 – Steven 2010-03-02 09:20:52

2

我不知道我們是否在談論同樣的想法,但如果我們是,我喜歡你的解釋。很快,我會解釋我做了什麼來解決這個問題。在我的情況下,我的域圖層中的所有商店對象必須覆蓋兩種方法:

很明顯,爲了保持這一點,我有更多的類受到牽連,但我不會在這裏寫所有,因爲我只是試圖解釋概念

List<ValidationRule> notPassedValidationRules = new List<ValidationRule>(); 

//... 

public override void ValidateErrorsWhenSaving(Validator validator) 
{ 
    //... 
} 

public override void ValidateErrorsWhenDelete(Validator validator) 
{ 
    //... 
}   

在這些方法中,我檢查了一些布爾條件,保留了一個未傳遞規則的集合。在我的情況下,這些方法在我的Unit Of Work提交更改(插入新實體,更新,刪除)之前被調用,並在提交之前向用戶顯示可能的錯誤。

相關問題