ディレクトリに戻る
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; }
そして、この設計方法は、将来のメンテナンスに多くの問題を引き起こす可能性があります。具体的に要約しましょう:
データ エンティティと混在しており、エンティティを拡張および更新するときに、機能は使用されません。追加した内容が失われる可能性があります
複数の 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 中国語 Web サイトの他の関連記事を参照してください。