首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate验证器:使用属性与使用ValidationDefs

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

Stack Overflow用户
提问于 2011-03-16 08:46:24
回答 1查看 1.8K关注 0票数 2

我使用not已经有一段时间了,主要是通过ValidationDef,但是我仍然不确定有两件事:

  1. 使用ValidationDef进行简单/标准验证有什么特殊好处(如NotNullMaxLength等)?
  2. 我担心这两种方法会在验证中抛出不同类型的异常,例如:
    • ValidationDefDefine.NotNullable()抛出PropertyValueException
    • 使用[NotNull]属性时,会抛出一个InvalidStateException

这让我认为,将这两种方法混合使用并不是一个好主意--要始终如一地处理验证异常非常困难。有什么意见/建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-17 09:36:31

ValidationDef可能更适合于业务规则验证,尽管如此,我甚至将它用于简单的验证。还有更多的这里

我喜欢ValidationDef的一个事实是它有一个流畅的界面。我已经和这个引擎玩了很长一段时间了,我整理了一些对我来说很好的东西。

我定义了一个接口:

代码语言:javascript
复制
public interface IValidationEngine
{
    bool IsValid(Entity entity);
    IList<Validation.IBrokenRule> Validate(Entity entity);
}

它在我的验证引擎中实现:

代码语言:javascript
复制
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);
    }
}

我把我所有的域名规则都插进去了。

我在应用程序启动时引导引擎:

代码语言:javascript
复制
For<Validation.IValidationEngine>()
    .Singleton()
    .Use<Validation.ValidationEngine>();

现在,当我需要在保存之前验证我的实体时,我只需使用引擎:

代码语言:javascript
复制
if (!this._ValidationEngine.IsValid(User))
{
    BrokenRules = this._ValidationEngine.Validate(User);
}

并返回,最终,收集打破的规则。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5322838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档