NHibernate.Validator 实体验证框架
???? 在系統開發時,很多情況下都需要對實體進行驗證,比如規定某個屬性值不能為空,Email的格式或者電話號碼的格式是否正確.這種驗證不應該只在UI層進行,主要有以下幾方面的考慮:
???? 1.如果每個層次都相互獨立,就不能夠完全相信傳入數據的有效性.比如如果你的UI代碼直接調用了業務層,那么就能夠相信任何用戶的輸入.
???? 2. 因為每個層次都有可能有復用性.也就是使用環境可能不一樣.比如你的Webservice調用了你的業務層,你的UI也調用你的業務層.那么你的驗證放在哪?
??? 所以,在一個企業級系統中,對業務數據進行有效驗證是非常有必要的.我覺得一個好框架應該能夠滿足以下要求:
???? 1.能夠以很方便的方式進行規則驗證.一般有屬性標識或者XML.
???? 2.不僅提供豐富的基礎的規則驗證,而且能夠支持對驗證直接進行靈活擴展,添加用戶自定義規則.
???? 3.能夠很容易插撥.
???? 4.能夠滿足在不同的層使用同樣的驗證規則進行驗證.
??? 到現在為止,我接觸過Enterprise Library提供的Validation Application Block(http://www.codeplex.com/entlib)以及開源的驗證框架Validation Framework(http://www.codeplex.com/ValidationFramework),NHibernate.Valiator都符合上面的要求,而且現在他們都提供了對MVC,WPF的支持,相當的不錯.
??? OK,有點跑題了,言歸正傳.前段時間在NHibernate Contrib看到NHibernate.Validator項目,它是一個從Hibernate.Validator移植過來的開源項目,其實它和上面的兩個驗證框架都非常相似,提供的支持和功能基本上也都差不多.NHibernate.Valiator不僅可以對ORM中的業務對象進行驗證,它也可以脫離NHibernate單獨使用.相同,企業庫的Validation Application? Block和Validation Framework不僅可以對我們的業務對象驗證,也可以通過事件與NHibernate整合.
??? 好的,那就來詳細介紹一下NHibernate.Validator:
一.下載配置
??????? 首先下載NHibernate.Validator??? http://sourceforge.net/project/showfiles.php?group_id=216446
??????? 然后在你使用的項目中引用相應的dll?
二. 配置
??????? NHibernate.Validator的配置有幾種方法:
?1.在你的應用程序下面新建文件nhvalidator.cfg.xml,在這個文件中添加配置信息
<property name='default_validator_mode'>UseXml</property>
<mapping assembly='NHibernate.Validator.Demo.Model'/> </nhv-configuration>
?
2.程序的app/web.config中添加配置信息
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="nhv-configuration" type="NHibernate.Validator.Cfg.ConfigurationSectionHandler, NHibernate.Validator" /> </configSections> <nhv-configuration xmlns='urn:nhv-configuration-1.0'><shared_engine_provider class='NHibernate.Validator.Event.NHibernateSharedEngineProvider, NHibernate.Validator'/> </nhv-configuration> </configuration>
3.全部使用程序進行配置
其實,你如果默認的方式使用,你可以不進行上面的任何配置,直接就可以調用:
ValidatorEngine validator = new ValidatorEngine(); bool isValid = validator.IsValid(customer);???? 上面的設置中有autoregister_listeners屬性就是設置Validator是否自動的監聽NHibernate的內置事件PreInsertEvent和PreUpdateEvent,如果為True,就是在實體進行添加和更新前都會對實體進行驗證(這里包括級聯驗證),如果驗證沒有通過則會發出異常信息. 其實你也可以通過配置手動的監聽這兩個事件,在你的Hibernate的配置信息中添加:
??? 但是我們在哪里能夠保證我們調用的ValidatorEngine在我們的應用程序中只有一個實例呢(包括上面的兩個監聽事件的處理),因為我們這個在不同的層中都要使用的.肯定要保證驗證的一致性. (當然也可以不進行這個設置),其中的一個方法就是設置SharedEngineProvider,在上面的配置時添加:
我們先看一下ISharedEngineProvider接口,很簡單,就一個方法:
然后是默認的NHibernateSharedEngineProvider怎么實現這個接口的:
public class NHibernateSharedEngineProvider : ISharedEngineProvider{private static readonly ValidatorEngine ve = new ValidatorEngine();// Explicit static constructor to tell C# compiler not to mark type as before field initstatic NHibernateSharedEngineProvider(){}#region ISharedEngineProvider Memberspublic ValidatorEngine GetEngine(){return ve;}#endregion}
可以看到,其實也很簡單,不過這樣的話這里會不會有多線程問題呢?不過這里即使有多線程問題,我覺得這也沒有必要.
?????? 4.在使用IOC容器的系統和Web環境下,最好重新實現自己的SharedEngineProvider.不過,在這里介紹怎么在spring.net中配置NHibernate.Validator,并且能夠使用DI直接使用聲明的Validator對象.因為沒有找到能夠自動可以注入的ValidatorEngine,我自己實現了一個:
?????
???????? 然后在配置文件中聲明對象,并且設置屬性:
?????????? <object id="NHValidator" type="Demo.NHValidatorObject,Demo" singleton="true">
??????? <property name="ApplyToDDL" value="true"></property>
??????? <property name="AutoRegisterListeners" value="true"></property>
??????? <property name="DefaultMode" value="UseXml"></property>
??????? <property name="MappingAssemblies">
??????????? <list>
??????????????? <value>Demo.Model</value>
??????????? </list>
??????? </property>
??? </object>
?
這樣,你就要在你的任何一個層次中從applicationContext或者是通過依賴注入獲取ValidatorEngine來完成實體驗證了.
三.使用
采用屬性定義的方式:
采用XML映射文件的方式:(注意這里文件要為嵌入式資源,后面要以.nhv.xml結尾)
而且,NHibernate.Validator還支持以上兩種方法混合使用.那我們再看一下怎么擴展自己的驗證規則,首先先實現IValidator:
然后是對應的屬性標識:
四.資料
1.NHibernate Validator 1.0.0 Documentation http://nhforge.org/wikis/validator10/nhibernate-validator-1-0-0-documentation.aspx
2.S#arp Architecture (Castle+AcitiveRecord+NHibernate.Validator)http://groups.google.com/group/sharp-architecture?hl=en
3.NHibernate.Validator - ASP.NET MVC http://www.pnpguidance.net/post/NHibernateValidatorTutorialValidateBusinessObjectsMVC.aspx
4.Diving in NHibernate.Validator http://fabiomaulo.blogspot.com/2009/02/diving-in-nhibernatevalidator.html
5.NHibernate Validator http://www.codinginstinct.com/2008/05/nhibernate-validator.html
作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
轉載于:https://www.cnblogs.com/lonely7345/archive/2009/03/15/1412159.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的NHibernate.Validator 实体验证框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET空间使用SQLite遇到的
- 下一篇: 民工语录