本文摘自PHP中文网,作者零下一度,侵删。
回到目录在MVC,EF,LINQ环境里,我们经常会用到DataModel(DO)和ViewModel(VO),可能对于它们的属性校验我们会采用特性的方式,当然这很直观,就连微软的DEMO也是如些,一般是这样的代码
1 2 3 | [MaxLength(128)] public string AgentName { get; set; }
[MaxLength(128)] public string AgentUser { get; set; }
|
而这种设计方式给我们以后的维护带来很多问题,具体大叔总结一下:
与数据实体混在一起,不利用扩展,更新实体你加的特性可能会丢失
如果有多个VO,那么你需要把它加到具体的VO上,因为DO的语义可能不太明确
不方便迁移,它与ModelState耦合太高
从面向对象的角度来看,它的职责太单一,引起变因太多
综上所述,FluentValidation就诞生了!
nuget上去安装它:install-package FluentValidation
你的一个实体类,可以添加多个检验类,这相当于可以有多种检验类去装饰一个实体类,我觉得挺好!
1 2 3 4 5 6 7 | public class CreateUserEventValidator : AbstractValidator<CreateUserEvent>{ 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( "你的年?o太小了!" );
}
}
|
使用时,可以通过IsValid,Errors等属性拿到你需要的信息,当然,你也可以把它在命令事件,领域事件上用一下,比如做个验证的装饰器,哪些处理程序要用校验,就通过这个装饰器装饰一下就行了,挺优雅!
1 2 3 4 | BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>(
UserEventHandler(),
BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName = });
|
装饰器要求你转一个要被装饰的对象和一个装饰器,就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {
{
_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等书籍!
感谢各位的阅读!
以上就是EF架构--FluentValidation的实际用法的详细内容!
相关阅读 >>
ef架构--FluentValidation的实际用法
理解asp.net中多层架构
解析.net逻辑分层架构
实现内容精准化搜索和用户精准化推送的实例教程
更多相关阅读请进入《FluentValidation》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » EF架构--FluentValidation的实际用法