В MVC я могу создать Model Validator, который может принимать зависимости. Для этого я обычно использую FluentValidation. Это позволяет мне, например, проверить регистрацию учетной записи, что адрес электронной почты не был использован (NB: Это упрощенный пример!):
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;
}
}
Такая интеграция не существует для веб-API с FluentValidation. Там была пара попытки в этом, но не были решены зависимость Инъекционный аспект и работает только со статическими валидаторами.
Причина, по которой это сложно, объясняется различиями в реализации ModelValidatorProvider и ModelValidator между MVC и Web API. В MVC они создаются для каждого запроса (следовательно, инъекция контекста проста). В Web API они являются статическими, а ModelValidatorProvider поддерживает кэш ModelValidators для каждого типа, чтобы избежать ненужных поисков отражения при каждом запросе.
Я пытался добавить необходимую интеграцию самостоятельно, но застрял, пытаясь получить область зависимостей. Вместо этого мне показалось, что я вернусь и спрошу, есть ли какие-либо другие решения проблемы - если кто-нибудь придумал решение для проверки модели, где могут быть введены зависимости.
Я НЕ хочу выполнять проверку в контроллере (я использую ValidationActionFilter, чтобы сохранить это отдельно), что означает, что я не могу получить какую-либо помощь от инжектор конструктора контроллера.