ホームページ  >  記事  >  バックエンド開発  >  EF アーキテクチャ -- FluentValidation の実際の使用法

EF アーキテクチャ -- FluentValidation の実際の使用法

零下一度
零下一度オリジナル
2017-06-24 10:39:581705ブラウズ

ディレクトリに戻る

MVC、EF、LINQ 環境では、DataModel (DO) と ViewModel (VO) をよく使用します。もちろん、これは Microsoft のデモでも非常に直感的です。このように、通常は次のようなコードを作成します

        /// <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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。