Обращение к базе данных из атрибута проверки данных

У меня есть типизированная клиентская сторона, которая возвращает список 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 
    }
Другие вопросы по тегам