NHibernate验证器:使用属性与使用ValidationDefs
我已经使用NH Validator一段时间了,主要是通过NHibernate验证器:使用属性与使用ValidationDefs,nhibernate,validation,Nhibernate,Validation,我已经使用NH Validator一段时间了,主要是通过ValidationDefs,但我仍然不确定两件事: 使用ValidationDef进行简单/标准验证(如NotNull,MaxLength等)有什么特别的好处吗 我担心这两种方法会在验证时抛出不同类型的异常,例如: ValidationDef的Define.NotNullable()抛出PropertyValueException 使用[NotNull]属性时,会引发InvalidStateException 这让我觉得混合使用这两种
ValidationDef
s,但我仍然不确定两件事:
ValidationDef
进行简单/标准验证(如NotNull
,MaxLength
等)有什么特别的好处吗
的ValidationDef
抛出Define.NotNullable()
PropertyValueException
- 使用
属性时,会引发[NotNull]
InvalidStateException
这让我觉得混合使用这两种方法不是一个好主意——一致地处理验证异常将非常困难。有什么建议/建议吗?验证DEF可能更适合于,尽管如此,我甚至将其用于简单的验证。还有更多。
我喜欢ValidationDef的一点是它有一个流畅的界面。 我已经在这台发动机上玩了很长一段时间了,我已经组装了一些对我来说非常有效的东西。
我定义了一个接口:
public interface IValidationEngine
{
bool IsValid(Entity entity);
IList<Validation.IBrokenRule> Validate(Entity entity);
}
并最终返回被破坏规则的集合
public class ValidationEngine : Validation.IValidationEngine
{
private NHibernate.Validator.Engine.ValidatorEngine _Validator;
public ValidationEngine()
{
var vtor = new NHibernate.Validator.Engine.ValidatorEngine();
var configuration = new FluentConfiguration();
configuration
.SetDefaultValidatorMode(ValidatorMode.UseExternal)
.Register<Data.NH.Validation.User, Domain.User>()
.Register<Data.NH.Validation.Company, Domain.Company>()
.Register<Data.NH.Validation.PlanType, Domain.PlanType>();
vtor.Configure(configuration);
this._Validator = vtor;
}
public bool IsValid(DomainModel.Entity entity)
{
return (this._Validator.IsValid(entity));
}
public IList<Validation.IBrokenRule> Validate(DomainModel.Entity entity)
{
var Values = new List<Validation.IBrokenRule>();
NHibernate.Validator.Engine.InvalidValue[] values = this._Validator.Validate(entity);
if (values.Length > 0)
{
foreach (var value in values)
{
Values.Add(
new Validation.BrokenRule()
{
// Entity = value.Entity as BpReminders.Data.DomainModel.Entity,
// EntityType = value.EntityType,
EntityTypeName = value.EntityType.Name,
Message = value.Message,
PropertyName = value.PropertyName,
PropertyPath = value.PropertyPath,
// RootEntity = value.RootEntity as DomainModel.Entity,
Value = value.Value
});
}
}
return (Values);
}
}
For<Validation.IValidationEngine>()
.Singleton()
.Use<Validation.ValidationEngine>();
if (!this._ValidationEngine.IsValid(User))
{
BrokenRules = this._ValidationEngine.Validate(User);
}