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

2024-03-21

我使用 NH Validator 一段时间了,主要是通过ValidationDefs,但我仍然不确定两件事:

  1. 使用有什么特别的好处吗ValidationDef用于简单/标准验证(例如NotNull, MaxLength etc)?
  2. I'm worried about the fact that those two methods throw different kinds of exceptions on validation, for example:
    • ValidationDef's Define.NotNullable() throws PropertyValueException
    • 使用时[NotNull]属性,一个InvalidStateException被抛出。

这让我认为混合这两种方法不是一个好主意 - 一致地处理验证异常将非常困难。有什么建议/推荐吗?


验证定义可能更适合业务规则验证 http://fabiomaulo.blogspot.com/2010/01/nhibernatevalidator-changing-validation.html即使话虽如此,我也用它来进行简单的验证。还有更多here http://fabiomaulo.blogspot.com/2009/10/nhibernatevalidator-extending_26.html.
我喜欢什么验证定义事实上,它有一个流畅的界面。 我已经使用这个引擎很长一段时间了,并且我已经组装了一些对我来说非常有效的东西。
我定义了一个接口:

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);
}

并最终返回被破坏的规则的集合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 验证器:使用属性与使用 ValidationDefs 的相关文章

随机推荐