ABP理論学習の検証DTO

3493 ワード

総ディレクトリに戻る
本編目録
  • 検証紹介
  • データ注釈
  • を使用
  • カスタム検証
  • 標準化
  • 検証の概要
    まず、アプリケーションの入力を検証する必要があります.ユーザまたは他のアプリケーションは、そのアプリケーションに入力を送信することができる.1つのWebアプリケーションでは、検証は通常、クライアントとサーバ側で2回実行されます.クライアントの検証は、ほとんどの場合、ユーザー体験のために実現されます.クライアントでは、まずフォームをチェックし、ユーザーに不正なフィールドを表示したほうがいいです.しかし、サービス側の検証はより重要であり、避けられない.
    サービス側の検証は、通常、アプリケーション・サービス・レイヤで実装されます.アプリケーション・サービス・メソッドは、まず入力を確認(検証)してから使用する必要があります.ABPは、アプリケーション・サービス・メソッドの入力を検証するための優れたインフラストラクチャを提供しています.
    アプリケーション・サービス・メソッドは、入力としてDTO(データ転送オブジェクト)を受信する.ABPにはIValidateインタフェースがあり,そのインタフェースを実現したDTOであれば自動的に検証できる.IInputDtoはIValidateを継承しているので,入力DTOsにIInputDtoを実装すれば検証が確保できる.
    データ注記の使用
    ABPはデータ注記特性をサポートする.タスクを作成するタスク(Task)アプリケーションサービスを開発するとします.入力パラメータのタイプは次のようになります.
    public class CreateTaskInput : IInputDto
    {
        public int? AssignedPersonId { get; set; }
    
        [Required]
        public string Description { get; set; }
    }
    

    ここで、DescriptionプロパティはRequiredと表記されます.AssignedPersonIdはオプションです.システムでComponentModel.DataAnnotationsネーミングスペースにも多くの特性があります(MaxLength,MinLength,RegularExpressionなど).タスク・アプリケーション・サービスの実装を見てみましょう.
    public class TaskAppService : ITaskAppService
    {
        private readonly ITaskRepository _taskRepository;
        private readonly IPersonRepository _personRepository;
    
        public TaskAppService(ITaskRepository taskRepository, IPersonRepository personRepository)
        {
            _taskRepository = taskRepository;
            _personRepository = personRepository;
        }
    
        public void CreateTask(CreateTaskInput input)
        {
            var task = new Task { Description = input.Description };
    
            if (input.AssignedPersonId.HasValue)
            {
                task.AssignedPerson = _personRepository.Load(input.AssignedPersonId.Value);
            }
    
            _taskRepository.Insert(task);
        }
    }
    

    ご覧のように、ABPが自動的に検証を行うため、ここには検証コードが書かれていません.ABPは入力がnullであるかどうかもチェックします.nullの場合、AppValidationExceptionが放出されます.したがってnullを検出するコード(ガード文)を書く必要はありません.入力したプロパティのいずれかが不正である場合、同じ例外が放出されます.
    このメカニズムとASP.NET MVCの検証は似ているが,アプリケーションサービスクラスはControllerから派生するのではなく,純粋なクラスであり,webアプリケーション以外で動作することに注意する.
    カスタム認証
    データ注釈がまだあなたの状況を満たすことができない場合は、ICustomValidateインタフェースを実現することができます.以下に示します.
    public class CreateTaskInput : IInputDto, ICustomValidate
    {
        public int? AssignedPersonId { get; set; }
    
        public bool SendEmailToAssignedPerson { get; set; }
    
        [Required]
        public string Description { get; set; }
    
        public void AddValidationErrors(List<ValidationResult> results)
        {
            if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || AssignedPersonId.Value <= 0))
            {
                results.Add(new ValidationResult("AssignedPersonId must be set if SendEmailToAssignedPerson is true!"));
            }
        }
    }
    

    ICustomValidateインタフェースは、実装するAddValidationErrorsメソッドを宣言します.ここでは、SendEmailToAssignedPersonプロパティがあります.値がtrueで、AssignedPersonIdまたは負の値が指定されていない場合は、ここで検証エラーが発生したと判断し、ValidationResultオブジェクトをresultsセットに追加する必要があります.
    標準化
    DTOパラメータを配列するために、検証後に追加の操作を実行することができます.ABPは、DTOパラメータの配列の目的を達成するために、Normalizeメソッドを定義するIShouldNormalizeインタフェースを定義する.インタフェースを実装した場合は、認証後(メソッド呼び出し前)にNormalizeメソッドを呼び出す必要があります.DTOにソート(Sorting)方向が必要な場合は、デフォルト値を設定します.
    public class GetTasksInput : IInputDto, IShouldNormalize
    {
        public string Sorting { get; set; }
            
        public void Normalize()
        {
            if (string.IsNullOrWhiteSpace(Sorting))
            {
                Sorting = "Name ASC";
            }
        }
    }