1

Мне нужна проверка поля в отношении базы данных, возможно, с использованием других зарегистрированных сервисов. Я читал documentation, но не нашел ответа.Пользовательская проверка ASP.NET Core для базы данных

Существует дистанционная проверка, вызывающая метод контроллера, но только на стороне клиента, поэтому отключение JS отключает проверку. Существует также выборочная проверка, которая использует атрибуты проверки и прекрасно содержится в пределах ModelState.IsValid, но я не могу встраивать зависимости в его конструктор.

Я нашел this question, отмеченный как ответ, поскольку он говорит о зависимом преобразователе, но я не могу найти полезной информации об этом.

Я пробовал исследовать его, но все, что я натолкнулся, было связано только с инъекциями зависимостей или IServiceProvider, которые не работали для меня. Вот некоторые из моих неудачных попыток:

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     //--1------------------------------- 
     var container = new ServiceContainer(); 
     var _context = container.GetService<ApplicationDbContext>(); 
     //---------------------------------- 

     //--2------------------------------- 
     var services = new ServiceCollection(); 
     IServiceProvider servicesProvider = services.BuildServiceProvider(); 
     var _context = servicesProvider.GetService<ApplicationDbContext>(); 
     //---------------------------------- 

     return ValidationResult.Success; 
    } 

Каждый извлекаться _context был нулевым. Я действительно исчерпал все идеи здесь, и буду благодарен за любую помощь.

+0

Вы не должны вводить зависимости в атрибуты, выраженные [здесь] (https://stackoverflow.com/a/29916075/264697), [здесь] (http://blog.ploeh.dk/2014/06/13/passive-attributes /) и [здесь] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97). – Steven

ответ

1

Я столкнулся с аналогичной проблемой. Я попробовал некоторые «неоднородные» способы (на всякий случай, когда вы «должны»). Как будто я застрял с атрибутом DuplicateMatch для электронной почты - для этого нужен доступ к базе данных, и ничего не было доступно в моем настраиваемом атрибуте validationAttribute.

  1. Мой DAL это отдельный проект, так что вместо чистого DI (инъекции зависимостей) - я держал инициализацию DBConext в DAL (она имеет свою собственную appSettings.json), так что никто другой не беспокоили пройти DbContext, и т.д .. просто вызовите DAL (или Service layer), и ему удастся самостоятельно запустить DBContext.
  2. Как-то используйте шаблон «Locator», чтобы получить экземпляр DBContext и любые другие объекты, которые были настроены для DI - еще не проверены.
  3. Повинуйтесь шаблону DI и выполните мою DuplicateMatch или любую другую такую ​​проверку (которая требует доступа DAL в самом действии контроллера или в уровне обслуживания), а не с атрибутом проверки.

Сообщите мне, если это поможет. И мне было бы интересно узнать больше от сообщества о путях (например, 3.), которые не нарушают шаблон DI.

+0

Спасибо за ваш ответ, я пробовал некоторые предложения @Steven, но я думаю, что у меня нет необходимых знаний, чтобы полностью их понять, и это похоже на большую работу для такой (казалось бы) простой задачи. Я в конечном итоге использовал третий способ, я положил валидацию в службу. Не столь элегантное решение, как атрибут, но оно кажется безопасным и удерживающим его в обслуживании, позволяет контроллеру оставаться относительно чистым. Я посмотрю на твои другие предложения, потому что сейчас у меня много работы. – Bielik

Смежные вопросы