2011-09-22 93 views
2

是否可以使用PreTranctionCommint事件中的Nhibernate驗證框架驗證域模型?如果可能的話,我們如何寫這個活動?下面NHibernate和NHibernate驗證

回答

2

摘自http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx

基於事件NHibernate的驗證採取

NHibernate的驗證器有兩個內置NHibernate的事件偵聽器。 每當PreInsertEvent或PreUpdateEvent發生時,偵聽器將 驗證實體實例的所有約束,並在違反任何約束時拋出異常 。基本上,對象將在 任何插入之前以及由NHibernate觸發的任何更新之前進行檢查。這 包括級聯更改!這是激活驗證過程的最方便和最簡單的方法。如果違反約束,則該事件將引發一個運行時InvalidStateException,其中包含描述每個故障的InvalidValues數組。

+0

感謝Cole W.有可能在事務提交事件上編寫我們自己的偵聽器。如果是的話,這是正確的方式來驗證這個事件? – viky

+0

如果您將nhibernate驗證器設置爲與nhibernate集成,您的實體將在Commit上進行驗證。 –

4

是否可以驗證與NHibernate驗證 框架的域模型...?

如果你真的有domain model那麼它不需要驗證框架。換句話說,這些對象封裝了行爲並保護了它們的內部不變量而不依賴於外部的魔法驗證框架。域對象永遠不會進入first place中的「無效」狀態。如果他們長壽,那麼他們也應該「永遠堅持」。你的域對象的有效性不應該依賴於數據訪問庫可能或不可能觸發的事件。您也可以發現不考慮驗證是有幫助的,因爲它是過度廣義化和上下文相關的,而是考慮業務對象INVARIANTS。您不需要第三方框架來在對象中正確執行不變量。如果不將域類耦合到驗證框架,實現它並不難。

但是,如果你改一下你的問題:

是否可以驗證與NHibernate驗證 框架anemic域模型...?

然後答案是:是的,去吧,它太棒了!但請記住,隨着複雜性的增長,您希望執行更復雜的涉及多個對象字段,獨立域服務等的複雜域規則。您將通過編寫「自定義驗證器」或者只是放棄它而越來越多地與驗證框架耦合並最終實現了由框架和其他遍佈代碼庫的一些規則。一般來說,這可能值得一看answer和DDD。

+0

感謝德米特里,我從您的答案中獲得更多知識 – viky

+0

Downvoter會關心評論嗎? – Dmitry

+0

您無法驗證域模型中的所有內容,最簡單的情況是您有開始日期和結束日期,某些規則需要從數據庫讀取,我更願意在(插入,更新,刪除)時應用驗證,例外列出所有違規規則(這將有助於其他圖層) –

0

這個怎麼樣?

using(transaction...) 
{ 
    validationA(); 
    validationB(); 
    session.saveOrUpdate();(do some transaction) 
} 
+0

請用解釋擴展您的答案。 –