Обращение к базе данных из атрибута проверки данных
У меня есть типизированная клиентская сторона, которая возвращает список json и предоставляет пользователю опции для определенного списка мест, которые они могут ввести для поля ввода.
На сервере я хочу убедиться, что представленные данные формы соответствуют одному из этих мест. Реально это должно происходить, если кто-то не был злонамеренным и не публиковал данные из скрипача или что-то в этом роде.
Я поставляю данные для typeahead из списка, хранящегося в Redis. Я читал, что плохая практика - обращаться к базе данных из атрибута, но я хотел бы проверить наличие места в списке redis, прежде чем разрешить продолжение логического потока.
Я мог бы статически кэшировать список при запуске в каждом экземпляре веб-сервера, однако теперь это означает, что если список вообще изменится, то все серверы придется перезапустить, чтобы получить изменения.
Возможно, вместо использования атрибутов валидации я должен использовать беглый валидатор?
http://fluentvalidation.codeplex.com/wikipage?title=ValidatorFactory&referringTitle=Documentation
1 ответ
Я читал, что это плохая практика, чтобы связаться с базой данных из атрибута [...]
Ваш атрибут не должен знать о какой-либо базе данных или что-либо в этом роде. Что ваш атрибут должен сделать, это позвонить в службу, чтобы сделать работу. Реализация Сервиса будет скрыта с точки зрения вашего Атрибута.
interface IValidationService
{
bool DoesPlaceExist(Place place);
}
class RedisValidationService : IValidationService
{
bool DoesPlaceExist(Place place)
{
// crazy redis magic ...
}
}
class PlaceValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var validationService = new RedisValidationService(); // ideally use IoC
var isValid = validationService.DoesPlaceExists(new Place(value));
// ... this is over simplified to just show the idea
// return blah blah
}