Maison  >  Article  >  développement back-end  >  Architecture EF – utilisation réelle de FluentValidation

Architecture EF – utilisation réelle de FluentValidation

零下一度
零下一度original
2017-06-24 10:39:581620parcourir

Retour au répertoire

Dans les environnements MVC, EF et LINQ, nous utilisons souvent DataModel (DO) et ViewModel (VO). Nous pouvons utiliser des caractéristiques pour vérifier leurs propriétés. Bien sûr, c'est très. intuitive, même la DÉMO de Microsoft est comme ça. Généralement, le code est comme ça

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

Cette méthode de conception posera de nombreux problèmes à notre future maintenance. Plus précisément, Oncle résume :

  1. est mélangé avec des entités de données. Si vous n'utilisez pas d'extensions, les fonctionnalités que vous ajoutez risquent d'être perdues lors de la mise à jour de l'entité

  2. S'il y en a. beaucoup de VO, alors vous devez l'ajouter à un VO spécifique, car la sémantique de DO peut ne pas être claire

  3. , ce qui n'est pas pratique pour la migration, et il est trop fortement couplé à ModelState

  4. D'un point de vue orienté objet, ses responsabilités sont trop uniques et provoquent trop de variables

Pour résumer, FluentValidation est né !

Allez sur nuget pour l'installer : install-package FluentValidation

Une de vos classes d'entité peut ajouter plusieurs classes d'inspection, ce qui équivaut à avoir plusieurs classes d'inspection de décoration. une classe d'entité, je trouve que c'est plutôt bien !

   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("你的年紀太小了!");
        }
    }
Lorsque vous l'utilisez, vous pouvez obtenir les informations dont vous avez besoin via des attributs tels que IsValid et Errors. Bien sûr, vous pouvez également l'utiliser sur des événements de commande et des événements de domaine, tels que. as Créez un décorateur de vérification. Quels gestionnaires doivent être vérifiés, décorez-les simplement avec ce décorateur. C'est très élégant !

   
   BusManager.Instance.Subscribe( ValidatorDecorator<CreateUserEvent>(
 UserEventHandler(),

   BusManager.Instance.Subscribe( LoggerDecorator<CreateUserEvent>( CreateUserEvent { UserName =  });
Le décorateur vous demande de transférer un objet à décorer et un décorateur, et c'est tout.

    /// <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);
        }
    }
L'apprentissage et la compréhension d'un type de connaissances nécessitent une base théorique. Vous pouvez lire plus de livres tels que Design Module, Introduction to Algorithms, .netCLR et ainsi de suite !

Merci d'avoir lu !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn