FluentValidation的实际用法

今天小编给大家分享的是FluentValidation的实际用法的详细介绍,相信很多人都不太了解,为了让大家更加了解FluentValidation的实际用法,所以给大家总结了以下内容,话不多说,一起往下看吧。

创新互联公司服务项目包括韶山网站建设、韶山网站制作、韶山网页制作以及韶山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,韶山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到韶山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

在MVC,EF,LINQ环境里,我们经常会用到DataModel(DO)和ViewModel(VO),可能对于它们的属性校验我们会采用特性的方式,当然这很直观,就连微软的DEMO也是如些,一般是这样的代码

        /// /// 机构ID/// [DisplayName("机构ID")]public int AgentId { get; set; }/// /// 机构名称/// [DisplayName("机构名称")]
        [MaxLength(128)]public string AgentName { get; set; }/// /// 机构负责人/// [DisplayName("机构负责人")]
        [MaxLength(128)]public string AgentUser { get; set; }

而这种设计方式给我们以后的维护带来很多问题,具体大叔总结一下:

  1. 与数据实体混在一起,不利用扩展,更新实体你加的特性可能会丢失

  2. 如果有多个VO,那么你需要把它加到具体的VO上,因为DO的语义可能不太明确

  3. 不方便迁移,它与ModelState耦合太高

  4. 从面向对象的角度来看,它的职责太单一,引起变因太多

综上所述,FluentValidation就诞生了!

nuget上去安装它:install-package FluentValidation

你的一个实体类,可以添加多个检验类,这相当于可以有多种检验类去装饰一个实体类,我觉得挺好!

   public class CreateUserEventValidator : AbstractValidator{public CreateUserEventValidator()
        {
            RuleFor(command => command.UserName).NotEmpty().Length(5, 20).WithMessage("用户名升序为5-20字符!");
            RuleFor(command => command.Email).NotEmpty().EmailAddress().WithMessage("不是有效的Email!");
            RuleFor(command => command.BirthDay).NotEmpty().Must(i => i < DateTime.Now).WithMessage("你的年紀太小了!");
        }
    }

使用时,可以通过IsValid,Errors等属性拿到你需要的信息,当然,你也可以把它在命令事件,领域事件上用一下,比如做个验证的装饰器,哪些处理程序要用校验,就通过这个装饰器装饰一下就行了,挺优雅!

   
   BusManager.Instance.Subscribe( ValidatorDecorator(
 UserEventHandler(),

   BusManager.Instance.Subscribe( LoggerDecorator( CreateUserEvent { UserName =  });

装饰器要求你转一个要被装饰的对象和一个装饰器,就可以了。

    /// /// 验证装饰器/// ///     [Serializable]public class ValidatorDecorator   : IBusHandlerwhere TEvent : IBusData
    {/// /// 要被装饰的处理程序/// private readonly IBusHandler _inner;/// /// 校验装饰器集合/// private readonly IValidator[] _validators;/// /// 初始化/// /// 要被装饰的处理程序/// 装饰器public ValidatorDecorator(IBusHandler inner, params IValidator[] validators)
        {
            _inner = inner;
            _validators = validators;
        }public void Handle(TEvent evt)
        {var failures = _validators
                           .Select(v => v.Validate(evt))
                           .SelectMany(result => result.Errors)
                           .Where(error => error != null)
                           .ToList();if (failures.Any())
            {throw new ValidationException("实体校验失败", failures);
            }

            _inner.Handle(evt);
        }
    }

对于一种知识的学习与理解是需要一些理论基础的,大家可以多看看设计模块,算法导论,.netCLR等书籍!

看完上诉内容,你们对FluentValidation的实际用法大概了解了吗?如果想了解更多相关文章内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


文章题目:FluentValidation的实际用法
分享地址:http://hbruida.cn/article/gpjsgh.html