このスレッドで説明されているものと同様に、FluentValidation用の汎用リモートバリデーター拡張機能を構築しようとしています。このブログにはクライアント側のソリューションが掲載されていますが、クライアント側とサーバー側の両方で機能するにはリモートバリデーターが必要です。
ルールは次のようになります。
IRuleBuilderOptions<T, TProperty> Remote(string action,
string controller,
Expression<Func<T, object>>[] properties,
IComparable[] values,
HttpVerbs httpVerb = HttpVerbs.Get);
ここで
action
、およびcontroller
はアクション/コントローラーの名前です。
properties
はモデルプロパティ式の配列です(m => m.FirstName)
values
はリテラル値の配列です。
バリデーターのルールの設定は次のようになります。
this.RuleFor(m => m.Username).Remote("UsernameUnique", "RemoteController", null, null);
アクションメソッドを呼び出して値を渡すjQueryアダプターを作成するだけなので、クライアント側の部分を理解できると思います。
私が理解できないIsValid
のは、バリデーターのメソッドから、同じコントローラーアクションを呼び出す方法です。
これが私が検討したいくつかのオプションです:
どういうわけか、コントローラーアクションをリモートで呼び出し、スタブコンテキストを作成します。ただし、IoCを使用して依存性を注入する方法がわかりません。サービスロケーター?
通常の.NETメソッドを使用し、バリデーターとアクションメソッドの両方から呼び出します。
これは利用できる強力なバリデーターになると思いますが、私が思いついたオプションは、たとえうまく機能させたとしても、醜いものになるようです。
これに取り組むためのより良い方法はありますか?私はうまくいくものなら何でも完全にオープンです、少なくともエレガントなものではなく、あまり多くのオプションを見つけていません。しかし、この時点で、代替手段がなければ、私はエレガントでない解決策でも大丈夫でしょう。