>  기사  >  백엔드 개발  >  EF 아키텍처--FluentValidation의 실제 사용법

EF 아키텍처--FluentValidation의 실제 사용법

零下一度
零下一度원래의
2017-06-24 10:39:581715검색

디렉토리로 돌아가기

MVC, EF, LINQ 환경에서는 DataModel(DO)과 ViewModel(VO)을 사용하여 해당 속성을 확인하는 경우가 많습니다. 물론 이는 Microsoft의 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가 여러 개인 경우 DO의 의미가 명확하지 않을 수 있으므로 특정 VO에 추가해야 합니다.

  3. ModelState와의 결합은 편리하지 않습니다. 은 너무 높습니다

  4. 객체 지향 관점에서 볼 때 책임은 너무 단일하고 변수가 너무 많습니다

요약하자면 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의 실제 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.