MVC では、依存関係を取ることができるモデル バリデーターを作成できます。通常、これには FluentValidation を使用します。これにより、たとえば、メールアドレスが使用されていないことをアカウント登録で確認できます (注意: これは簡単な例です!):
public class RegisterModelValidator : AbstractValidator<RegisterModel> {
private readonly MyContext _context;
public RegisterModelValidator(MyContext context) {
_context = context;
}
public override ValidationResult Validate(ValidationContext<RegisterModel> context) {
var result = base.Validate(context);
if (context.Accounts.Any(acc => acc.Email == context.InstanceToValidate.Email)){
result.Errors.Add(new ValidationFailure("Email", "Email has been used"));
}
return result;
}
}
Web API と FluentValidation のそのような統合は存在しません。これにはいくつかの試みがありましたが、どちらも依存性注入の側面に取り組んでおらず、静的バリデーターでのみ機能します。
これが難しい理由は、MVC と Web API では ModelValidatorProvider と ModelValidator の実装が異なるためです。MVC では、これらはリクエストごとにインスタンス化されます (したがって、コンテキストの挿入は簡単です)。Web API では、これらは静的であり、ModelValidatorProvider は型ごとに ModelValidators のキャッシュを維持して、すべての要求で不要なリフレクション ルックアップを回避します。
必要な統合を自分で追加しようとしましたが、 Dependency Scope を取得しようとして行き詰まりました。代わりに、一歩下がって、問題に対する他の解決策があるかどうかを尋ねようと思いました-依存関係を注入できるモデル検証を実行するための解決策を誰かが思いついた場合。
コントローラー内で検証を実行したくありません (これを分離するためにValidationActionFilterを使用しています)。これは、コントローラーのコンストラクター注入から何の助けも得られないことを意味します。