Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate验证器:使用属性与使用ValidationDefs_Nhibernate_Validation - Fatal编程技术网

NHibernate验证器:使用属性与使用ValidationDefs

NHibernate验证器:使用属性与使用ValidationDefs,nhibernate,validation,Nhibernate,Validation,我已经使用NH Validator一段时间了,主要是通过ValidationDefs,但我仍然不确定两件事: 使用ValidationDef进行简单/标准验证(如NotNull,MaxLength等)有什么特别的好处吗 我担心这两种方法会在验证时抛出不同类型的异常,例如: ValidationDef的Define.NotNullable()抛出PropertyValueException 使用[NotNull]属性时,会引发InvalidStateException 这让我觉得混合使用这两种

我已经使用NH Validator一段时间了,主要是通过
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);
    }