ValidationAttributreでDIされたオブジェクトを取得する

こんにちは。beaglesoftの真鍋です。

このところ、開発しているときにあれどうだったっけ…?ってGoogleとかで検索をすると過去に書いたブログのエントリーが表示されることがあり記録を残すことは大事だと痛感してながら開発をしています。

以前同じような内容をASP.NET MVC5でまとめたのですが、ASP.NET MVC Coreでどうするのかをまとめていなかったのでこちらにまとめます。

blog.beaglesoft.net

やりたいこと

通常コントローラーのリクエストでバインドされるフィールドの値は検証処理を行うと思います。その検証処理は形式的なチェックもあると思うのですが、例えば登録済みのメールアドレスかどうかをチェックするというようなものもあると思います。この処理をデータベースの登録前に実行するということはもちろん必要ですが、コントローラーからサービスへ処理を行うまでにそもそも実行する必要がないものを弾きたいことはあると思います。

そのようなユースケースではValidationAttributreを利用して独自に検証処理を作成することができます。

今回はValidationAttributreでStartup.csなどでDIされたオブジェクトを利用する方法をまとめます。

具体的な方法

ValidationAttributreでDIされたオブジェクトを利用するためには、ValidationAttribute#IsValid(object value, ValidationContext validationContext)をオーバーライドして利用します。

IsValid(object value, ValidationContext validationContext)validationContextには GetService(Type serviceType) が定義されているので、このメソッドからDIしているオブジェクトを取得できます。

var service = (ISomeService) validationContext.GetService(typeof(ISomeService));

これでValidationAttributeでもDIされたオブジェクトを利用することができるようになるため、いろいろな検証処理をリクエストまでに実行することができるようになりますね。

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)