디렉토리로 돌아가기
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; }
그리고 이 설계 방법은 향후 유지 관리에 많은 문제를 가져올 것입니다. 구체적으로 요약해 보겠습니다.
데이터 엔터티와 혼합되어 사용되지 않습니다. 엔터티를 확장하고 업데이트할 때 기능은 다음과 같습니다. 추가한 내용이 손실될 수 있습니다
VO가 여러 개인 경우 DO의 의미가 명확하지 않을 수 있으므로 특정 VO에 추가해야 합니다.
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의 실제 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!