2010-07-14 25 views
1

我正在通過this msdn article by noted DDD expert Udi Dahan,他在那裏做了一個很棒的觀察,他說他花了好幾年才意識到; 「將所有電子郵件地址存入內存可能會讓你被性能警察鎖定,即使域模型調用某個調用數據庫的服務來查看電子郵件地址是否是不必要的。在數據庫中就足夠了。「使用db來防止UI演示文稿中的錯誤

在捕獲一些添加或編輯場景的LOB表示中,在所有編輯被認爲是有效的之前,您將不會啓用保存類型操作,因此首先要做到這一點是需要啓用「保存」準備通知用戶是否違反唯一性約束。但是如何用NHibernate來做到這一點呢?

我想它需要遵循下面的僞代碼的行。現在有人有這樣的做法嗎?

乾杯,
Berryl

try {} 
catch (GenericADOException) 
{ 
    // "Abort due to constraint violation\r\ncolumn {0} is not unique", columnName) 
    //(1) determine which db column violated uniqueness 
    //(2) potentially map the column name to something in context to the user 
    //(3) throw that can be translated into a BrokenRule for the UI presentation 
    //(4) reset the nhibernate session 
} 
+0

fyi當一個唯一的約束被破壞時,可能會出現一個更具體的異常。 – 2010-07-14 14:54:40

回答

3

悲觀的方法是在保存前檢查獨特的煩躁;樂觀的做法是嘗試保存並處理異常。樂觀方法的最大問題是,你必須能夠解析數據庫返回的異常,以便知道它是一個特定的唯一約束違規,而不是其他各種可能出錯的事情。

由於這個原因,在保存之前檢查獨特性要容易得多。這是一個簡單的數據庫調用來做這個檢查:select 1 where email = '[email protected]'。在讓他們填寫表單的其餘部分並單擊保存之前,通知用戶該值是重複的(也許他們已經在網站上註冊了?),這也是一種更好的用戶體驗。

獨特的約束應該一定到位,但UI應該檢查該地址在輸入表單時是否是唯一的。

+0

它迫使我堅持填寫一個長註冊表單,以發現惡魔$ layer69已被佔用。 – 2010-07-14 15:19:17

+0

這意味着在您的屬性更改之前在您的Email屬性設置器中執行該檢查,如果不是dup,並且添加了BRoken規則(如果是)。甜心 – Berryl 2010-07-14 15:21:04

+0

所以*你是*一直在拿我的惡魔$ layer69 nick :-) – Berryl 2010-07-14 15:29:48