首页后端开发ASP.NETEF架构--FluentValidation的实际用法

EF架构--FluentValidation的实际用法

时间2024-01-30 06:19:03发布访客分类ASP.NET浏览263
导读:收集整理的这篇文章主要介绍了EF架构--FluentValidation的实际用法,觉得挺不错的,现在分享给大家,也给大家做个参考。回到目录在MVC,EF,LINQ环境里,我们经常会用到Datamodel(DO 和ViewModel(VO ...
收集整理的这篇文章主要介绍了EF架构--FluentValidation的实际用法,觉得挺不错的,现在分享给大家,也给大家做个参考。回到目录

在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;
 }
    

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

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

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

  3. 不方便迁移,它与Model@R_512_2358@e耦合太高

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

综上所述,FluentValidation就诞生了!

nuget上去安装它:install-package FluentValidation

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

   public class CreateUsereventValidator : AbstractValidatorCreateUserEvent>
{
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( ValidatorDecoratorCreateUserEvent>
    ( UserEventHandler(),   BusManager.Instance.Subscribe( LOGgerDecoratorCreateUserEvent>
( CreateUserEvent {
 UserName =  }
    );
    

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

    /// summary>
    /// 验证装饰器/// /summary>
    /// tyPEparam name="TEvent">
    /typeparam>
        [Serializable]public class ValidatorDecoratorTEvent>
       : IBusHandlerTEvent>
where TEvent : IBusData    {
    /// summary>
    /// 要被装饰的处理程序/// /summary>
    PRivate readonly IBusHandlerTEvent>
     _inner;
    /// summary>
    /// 校验装饰器集合/// /summary>
    private readonly IValidatorTEvent>
    [] _validators;
    /// summary>
    /// 初始化/// /summary>
    /// param name="inner">
    要被装饰的处理程序/param>
    /// param name="validators">
    装饰器/param>
    public ValidatorDecorator(IBusHandlerTEvent>
     inner, params IValidatorTEvent>
[] 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的实际用法的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

FluentValidation实体检验

若转载请注明出处: EF架构--FluentValidation的实际用法
本文地址: https://pptw.com/jishu/592151.html
javascript怎么判断给定值是否在数组中 浅析Node中zip压缩和zip解压缩(附代码)

游客 回复需填写必要信息