本文共 2735 字,大约阅读时间需要 9 分钟。
在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; }
而这种设计方式给我们以后的维护带来很多问题,具体大叔总结一下:
综上所述,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(new ValidatorDecorator( new UserEventHandler(), new CreateUserEventValidator())); //日志-装饰器 BusManager.Instance.Subscribe(new LoggerDecorator (new UserEventHandler())); BusManager.Instance.Publish(new CreateUserEvent { UserName = "占占大师5个字" });
装饰器要求你转一个要被装饰的对象和一个装饰器,就可以了。
////// 验证装饰器 /// ///[Serializable] public class ValidatorDecorator : IBusHandler where TEvent : IBusData { /// /// 要被装饰的处理程序 /// private readonly IBusHandler_inner; /// /// 校验装饰器集合 /// private readonly IValidator[] _validators; /// /// 初始化 /// /// 要被装饰的处理程序 /// 装饰器 public ValidatorDecorator(IBusHandlerinner, 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等书籍!
感谢各位的阅读!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。