日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate.Validator 实体验证框架

發布時間:2025/3/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,在這個文件中添加配置信息

<?xml version="1.0" encoding="utf-8" ?> <nhv-configuration xmlns='urn:nhv-configuration-1.0'> <property name='apply_to_ddl'>true</property> <property name='autoregister_listeners'>true</property>
<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.全部使用程序進行配置

NHVConfiguration nhvc = new NHVConfiguration(); nhvc.Properties[Environment.ApplyToDDL] = "false"; nhvc.Properties[Environment.AutoregisterListeners] = "true"; nhvc.Properties[Environment.ValidatorMode] = "UseAttribute"; nhvc.Mappings.Add(new MappingConfiguration("NHibernate.ValidatorDemo.Model", null));ValidatorEngine validator = new ValidatorEngine(); validator.Configure(nhvc);

其實,你如果默認的方式使用,你可以不進行上面的任何配置,直接就可以調用:

ValidatorEngine validator = new ValidatorEngine(); bool isValid = validator.IsValid(customer);

???? 上面的設置中有autoregister_listeners屬性就是設置Validator是否自動的監聽NHibernate的內置事件PreInsertEvent和PreUpdateEvent,如果為True,就是在實體進行添加和更新前都會對實體進行驗證(這里包括級聯驗證),如果驗證沒有通過則會發出異常信息. 其實你也可以通過配置手動的監聽這兩個事件,在你的Hibernate的配置信息中添加:

<hibernate-configuration> ... <event type="pre-update"> <listener class="NHibernate.Validator.Event.ValidatePreUpdateEventListener, NHibernate.Validator"/> </event> <event type="pre-insert"> <listener class="NHibernate.Validator.Event.ValidatePreInsertEventListener, NHibernate.Validator"/> </event> ... </hibernate-configuration>


??? 但是我們在哪里能夠保證我們調用的ValidatorEngine在我們的應用程序中只有一個實例呢(包括上面的兩個監聽事件的處理),因為我們這個在不同的層中都要使用的.肯定要保證驗證的一致性. (當然也可以不進行這個設置),其中的一個方法就是設置SharedEngineProvider,在上面的配置時添加:

<shared_engine_provider class='NHibernate.Validator.Event.NHibernateSharedEngineProvider, NHibernate.Validator'/>



我們先看一下ISharedEngineProvider接口,很簡單,就一個方法:

/// <summary>/// Contract for Shared EngineP rovider/// </summary>public interface ISharedEngineProvider{/// <summary>/// Provide the shared engine instance./// </summary>/// <returns>The validator engine.</returns>ValidatorEngine GetEngine();}

然后是默認的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,我自己實現了一個:
?????

public class NHValidatorObject : IFactoryObject, IInitializingObject{#region Fieldsprivate ValidatorEngine validator;private IMessageInterpolator interpolator;private ValidatorMode defaultMode;private bool applyToDDL;private bool autoRegisterListeners;private string sharedEngineProviderClass;private string[] mappingAssemblies;#endregion/// <summary>/// Default MessageInterpolator/// </summary>public IMessageInterpolator Interpolator{set { interpolator = value; }}/// <summary>/// Default Mode to construct validators/// </summary>public ValidatorMode DefaultMode{set { defaultMode = value; }}/// <summary>/// Database schema-level validation enabled/// </summary>public bool ApplyToDDL{ set { applyToDDL = value; }}/// <summary>/// NHibernate event-based validation/// </summary>public bool AutoRegisterListeners{set { autoRegisterListeners = value; }}public string SharedEngineProviderClass{set { sharedEngineProviderClass = value; }}/// <summary>/// Sets the assemblies to load that contain mapping files./// </summary>/// <value>The mapping assemblies.</value>public string[] MappingAssemblies{set { mappingAssemblies = value; }}/// <summary>/// Return the validator/// </summary>/// <returns>The singleon validator factory.</returns>public object GetObject(){return validator;}/// <summary>/// Return the type/// </summary>/// <value>The type created by this factory</value>public System.Type ObjectType{get{return validator.GetType();}}/// <summary>/// Returns true/// </summary>/// <value>true</value>public bool IsSingleton{get{return true;}}/// <summary>/// Initialize validator for the given or the/// default location./// </summary>public virtual void AfterPropertiesSet(){NHVConfiguration config = new NHVConfiguration();config.Properties.Add(Environment.ApplyToDDL,applyToDDL.ToString());config.Properties.Add(Environment.AutoregisterListeners,autoRegisterListeners.ToString());config.Properties.Add(Environment.ValidatorMode, defaultMode.ToString());foreach(string assembly in mappingAssemblies){config.Mappings.Add(new MappingConfiguration(assembly,null));}validator = new ValidatorEngine();validator.Configure(config);}

???????? 然后在配置文件中聲明對象,并且設置屬性:


?????????? <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來完成實體驗證了.
三.使用
采用屬性定義的方式:

public class Customer{ [Length(Min = 3, Max = 20)] public string FirstName{ get; set; } [Length(Min=3, Max = 60)] public string LastName { get; set; } [CreditCardNumber] public string CreditCard { get; set;} }



采用XML映射文件的方式:(注意這里文件要為嵌入式資源,后面要以.nhv.xml結尾)

<nhv-mapping xmlns="urn:nhibernate-validator-1.0"> <class name="Demo.Customer,Demo"> <property name="FirstName"> <length min="3" max="20"/> </property> <property name="LastName"> <length min="3" max="60"/> </property> <property name="CreditCard"> <creditcardnumber/> </property> </class> </nhv-mapping>


而且,NHibernate.Validator還支持以上兩種方法混合使用.那我們再看一下怎么擴展自己的驗證規則,首先先實現IValidator:

public class PhoneValidator : IValidator{ public bool IsValid(object value) { Regex regex = new Regex(@"^[2-9]\d{2}-\d{3}-\d{4}$"); if (value == null)return true; return regex.IsMatch(value.ToString()); } }


然后是對應的屬性標識:

[AttributeUsage(AttributeTargets.Field AttributeTargets.Property)] [ValidatorClass(typeof(PhoneValidator))] public class PhoneAttribute : Attribute, IRuleArgs{ private string message = string.Empty; public string Message { get { return message; } set { message = value; } } }

四.資料
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 实体验证框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 裸体一区二区 | 专业操老外 | 亚洲综合色自拍一区 | 超碰美女在线 | 中文字幕一二三四 | 欧美日韩一区二区三区国产精品成人 | 就要日就要操 | 亚洲经典一区二区 | 国产黄色视| 日韩少妇一区二区三区 | 香蕉视频黄色在线观看 | 中文字幕中文在线 | 久久e热 | 日韩欧美极品 | 亚洲精品小视频 | 国产淫视 | 国产主播喷水 | 午夜影院美女 | 国产主播99 | 亚洲图片激情小说 | 爱福利视频一区 | 欧美国产不卡 | 中文字幕在线不卡视频 | 久久精品国产亚洲av麻豆色欲 | 在线观看a级片 | av东方在线 | www男人天堂 | www.国产黄色 | 做视频 | 成人av电影在线播放 | 欧美一区二区三区久久久 | 国产成人二区 | 久久一区av | 狠狠爱免费视频 | 天堂国产精品 | 先锋av在线资源 | 日本视频中文字幕 | 成人福利一区二区三区 | 鲁一鲁在线视频 | 中文字幕日韩欧美一区二区 | 国产伦精品一区二区三区四区视频 | 国产欧美一区二区三区四区 | 国产在线高清视频 | 久久久噜噜噜久久中文字幕色伊伊 | 亚洲情热 | 中文亚洲av片不卡在线观看 | 免费观看a级片 | 在线涩涩| 亚洲系列| 色诱久久av| av先锋在线 | 天天干网站 | 丁香六月激情综合 | 成年人黄色大全 | 国产精品国产三级国产aⅴ9色 | 九九热精品在线观看 | 91丝袜美女 | 久久青青草视频 | 奇米影视播放器 | 黄色一级视频 | 欧美色香蕉 | 真实的国产乱xxxx在线 | 日本一区二区视频 | 国产成人在线视频观看 | 欧美性猛交xxx乱久交 | 欧美三级视频在线播放 | 黑人精品无码一区二区三区AV | 久久国产欧美 | 免费看欧美一级特黄a大片 国产免费的av | 日韩免费三级 | 色噜噜狠狠狠综合曰曰曰 | 中文字幕日韩精品在线观看 | 一级黄色录相 | 日韩欧美中文字幕一区 | 人妻洗澡被强公日日澡电影 | 国产精品欧美亚洲 | 久久久久亚洲精品中文字幕 | 国产精品久久91 | 一二三四区视频 | 国产精品国色综合久久 | 中文字幕在线观看一区二区三区 | av在线a| 五月天丁香在线 | 性生活视屏| 五月天久久久久久 | 日本福利一区二区三区 | 欧洲成人一区二区三区 | 在线观看超碰 | 亚洲国产精品久久久久婷婷老年 | 国产3p在线播放 | 视频一区二区三区在线观看 | 亚洲大乳| 男人插女人视频网站 | 日本一区视频 | 色噜噜日韩精品欧美一区二区 | wwwav在线| 亚洲美女视频网 | 亚洲激情影院 | 国产成人在线播放 |