Вариант 1 не подходит. Единственный способ, которым он будет работать, заключается в получении зависимости через анти-шаблон локатора службы.
Опция 2 не работает . Хотя я не мог понять, как это было возможно из-за требований к атрибуту C #, это возможно. См. Следующие ссылки:
Вариант 3: Я не знал об этом ранее, но, как представляется, очень мощный способ написания валидаторов - это использование ModelValidator класса и соответствующего ModelValidatorProvider .
Сначала вы создаете свой собственный ModelValidatorProvider:
public class CustomModelValidatorProvider : ModelValidatorProvider
{
public CustomModelValidatorProvider(/* Your dependencies */) {}
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
if (metadata.ModelType == typeof(YourModel))
{
yield return new YourModelValidator(...);
}
}
}
ASP.NET MVC IDependencyResolver будет пытаться разрешить вышеуказанного провайдера, поэтому, пока он зарегистрирован в вашем контейнере IoC, вам больше ничего не нужно делать. И тогда ModelValidator:
public class EntryRatingViewModelValidatorMvcAdapter : ModelValidator
{
public EntryRatingViewModelValidatorMvcAdapter(
ModelMetadata argMetadata,
ControllerContext argContext)
: base(argMetadata, argContext)
{
_validator = validator;
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
if (/* error condition */)
{
yield return new ModelValidationResult
{
MemberName = "Model.Member",
Message = "Rating is required."
};
}
}
}
Поскольку провайдер извлекается через IDependencyResolver
, и провайдер имеет полный контроль над возвращенными ModelValidator
s, я легко смог ввести зависимости и выполнить необходимую проверку.