回到目录
在MVC,EF,LINQ环境里,我们经常会用到DataModel(DO)和ViewModel(VO),可能对于它们的属性校验我们会采用特性的方式,当然这很直观,就连微软的DEMO也是如些,一般是这样的代码
/// <summary>/// 机构ID/// </summary>[DisplayName("机构ID")]public int AgentId { get; set; }/// <summary>/// 机构名称/// </summary>[DisplayName("机构名称")]
[MaxLength(128)]public string AgentName { get; set; }/// <summary>/// 机构负责人/// </summary>[DisplayName("机构负责人")]
[MaxLength(128)]public string AgentUser { get; set; }
而这种设计方式给我们以后的维护带来很多问题,具体大叔总结一下:
与数据实体混在一起,不利用扩展,更新实体你加的特性可能会丢失
如果有多个VO,那么你需要把它加到具体的VO上,因为DO的语义可能不太明确
不方便迁移,它与ModelState耦合太高
从面向对象的角度来看,它的职责太单一,引起变因太多
综上所述,FluentValidation就诞生了!
nuget上去安装它:install-package FluentValidation
你的一个实体类,可以添加多个检验类,这相当于可以有多种检验类去装饰一个实体类,我觉得挺好!
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("你的年紀太小了!");
}
}
使用时,可以通过IsValid,Errors等属性拿到你需要的信息,当然,你也可以把它在命令事件,领域事件上用一下,比如做个验证的装饰器,哪些处理程序要用校验,就通过这个装饰器装饰一下就行了,挺优雅!
BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>(
UserEventHandler(),
BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName = });
装饰器要求你转一个要被装饰的对象和一个装饰器,就可以了。
/// <summary>/// 验证装饰器/// </summary>/// <typeparam name="TEvent"></typeparam> [Serializable]public class ValidatorDecorator<TEvent> : IBusHandler<TEvent>where TEvent : IBusData
{/// <summary>/// 要被装饰的处理程序/// </summary>private readonly IBusHandler<TEvent> _inner;/// <summary>/// 校验装饰器集合/// </summary>private readonly IValidator<TEvent>[] _validators;/// <summary>/// 初始化/// </summary>/// <param name="inner">要被装饰的处理程序</param>/// <param name="validators">装饰器</param>public ValidatorDecorator(IBusHandler<TEvent> inner, params IValidator<TEvent>[] 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等书籍!
感谢各位的阅读!
编辑推荐:
- EF架构--FluentValidation的实际用法02-21
- win10硬盘被占用怎么办02-21
- 使用Action的模型绑定实例教程02-21
- win10录屏功能怎么用图文教程 微软win10录屏文件在02-21
- win10网卡驱动出现问题解决方法02-21
- Unity C# GetSaveFileName()的实例详解02-21
- 调用user32.dll显示其他窗口02-21
- C#开发中遇到的问题分享02-21
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- win10硬盘被占用怎么办
win10硬盘被占用怎么办
26-02-21 - 使用Action的模型绑定实例教程
使用Action的模型绑定实例教程
26-02-21 - win10录屏功能怎么用图文教程 微软win10录屏文件在
win10录屏功能怎么用图文教程 微软win10录屏文件在
26-02-21 - win10网卡驱动出现问题解决方法
win10网卡驱动出现问题解决方法
26-02-21 - Unity C# GetSaveFileName()的实例详解
Unity C# GetSaveFileName()的实例详解
26-02-21 - 浅谈WPF之Binding表达式
浅谈WPF之Binding表达式
26-02-21 - 克隆对象的方法实例教程
克隆对象的方法实例教程
26-02-21 - 学习ASP.NET Core 2遇到的问题分享
学习ASP.NET Core 2遇到的问题分享
26-02-21 - C#基础之操作优化实例教程
C#基础之操作优化实例教程
26-02-21 - 总结EF通用数据层封装类实例详解
总结EF通用数据层封装类实例详解
26-02-21
