Web APIで複数のプロパティに対してバリデーションをかけたい
以前のプロジェクトでやったこと。
ASP.NET CoreのWeb APIでデータクラスを受け取った際にValidationをやりたい。そういうケースは当然あり、ASP.NET Coreにも検証機能が備わっています。
ASP.NET Coreに任せると[Required]
属性などを付与したプロパティでValidationをかけることができますが、複数のValidation条件の中で一つNGを検出したらそこで処理が中断されるため、1回のリクエストに対する検証項目が1つだけになってしまう。
マスタの登録画面で保存ボタンを押した際など、1度のリクエストで同時に複数の項目へのValidationを行いたいという状況がありました。
次のことをやっていました。
- 検証用Attributeクラスを作る。
Required、Range、大小比較の小さいほう、大きいほうなどを作りました。 - 検証対象のデータクラスのプロパティに検証用Attributeを付与。
- 自前の抽象クラス Validatable を作り、検証対象のデータクラスはこれを継承させる。
- Validatableクラスは void Validate() メソッドを持ち、呼び出されれば検証用Attributeの付与されたプロパティに対し全チェックを行う。
- チェック結果に1つ以上問題があれば、検証エラーのリストを乗せた自作Validation例外をスロー
- ExceptionFilterを自前で実装し、Validation例外を受けて検証エラーのリストを乗せたエラーレスポンスを作って返す
- Controllerでは受け取ったデータクラスに対し Validate()メソッドを呼び出すことで検証を行う
悪いプラクティスを含んでいる可能性もありますのでご注意(ご指摘ただければ幸いです)。
ソースはそのうち追加するかも。