好的,那就来详细介绍一下NHibernate.Validator:
一.下载配置
首先下载NHibernate.Validator 然后在你使用的项目中引用相应的dll二. 配置
NHibernate.Validator的配置有几种方法: 1.在你的应用程序下面新建文件nhvalidator.cfg.xml,在这个文件中添加配置信息true true UseXml
2.程序的app/web.config中添加配置信息
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的配置信息中添加:
但是我们在哪里能够保证我们调用的ValidatorEngine在我们的应用程序中只有一个实例呢(包括上面的两个监听事件的处理),因为我们这个在不同的层中都要使用的.肯定要保证验证的一致性. (当然也可以不进行这个设置),其中的一个方法就是设置SharedEngineProvider,在上面的配置时添加:... ...
我们先看一下ISharedEngineProvider接口,很简单,就一个方法:
////// Contract for Shared EngineP rovider /// public interface ISharedEngineProvider { ////// Provide the shared engine instance. /// ///The validator engine. 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 init static NHibernateSharedEngineProvider() { } #region ISharedEngineProvider Members public ValidatorEngine GetEngine() { return ve; } #endregion }可以看到,其实也很简单,不过这样的话这里会不会有多线程问题呢?不过这里即使有多线程问题,我觉得这也没有必要. 4.在使用IOC容器的系统和Web环境下,最好重新实现自己的SharedEngineProvider.不过,在这里介绍怎么在spring.net中配置NHibernate.Validator,并且能够使用DI直接使用声明的Validator对象.因为没有找到能够自动可以注入的ValidatorEngine,我自己实现了一个:
public class NHValidatorObject : IFactoryObject, IInitializingObject { #region Fields private ValidatorEngine validator; private IMessageInterpolator interpolator; private ValidatorMode defaultMode; private bool applyToDDL; private bool autoRegisterListeners; private string sharedEngineProviderClass; private string[] mappingAssemblies; #endregion ////// Default MessageInterpolator /// public IMessageInterpolator Interpolator { set { interpolator = value; } } ////// Default Mode to construct validators /// public ValidatorMode DefaultMode { set { defaultMode = value; } } ////// Database schema-level validation enabled /// public bool ApplyToDDL { set { applyToDDL = value; } } ////// NHibernate event-based validation /// public bool AutoRegisterListeners { set { autoRegisterListeners = value; } } public string SharedEngineProviderClass { set { sharedEngineProviderClass = value; } } ////// Sets the assemblies to load that contain mapping files. /// ///The mapping assemblies. public string[] MappingAssemblies { set { mappingAssemblies = value; } } ////// Return the validator /// ///The singleon validator factory. public object GetObject() { return validator; } ////// Return the type /// ///The type created by this factory public System.Type ObjectType { get { return validator.GetType(); } } ////// Returns true /// ///true public bool IsSingleton { get { return true; } } ////// Initialize validator for the given or the /// default location. /// 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); }
然后在配置文件中声明对象,并且设置属性:
这样,你就要在你的任何一个层次中从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结尾)
而且,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 2.S#arp Architecture (Castle+AcitiveRecord+NHibernate.Validator) 3.NHibernate.Validator - ASP.NET MVC 4.Diving in NHibernate.Validator 5.NHibernate Validator作者:()
出处: 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。