Использовать метод async в атрибуте пользовательской проверки в c#

#c# #asp.net #asp.net-core #asynchronous #custom-attributes

#c# #asp.net #asp.net-core #асинхронный #пользовательские атрибуты

Вопрос:

У меня есть асинхронный метод, который оценивает поле.

 Task<bool> MyMethod(object obj);
  

Я хочу создать атрибут пользовательской проверки, который использует вышеуказанный метод.
Моя проблема в том, что ValidationAttribute класс не поддерживает асинхронные методы.

Обычно я переопределяю следующий метод:

 ValidationResult IsValid (object? obj, ValidationContext validationContext);
  

Но результат моего асинхронного метода Task<ValidationResult> , и я не хочу использовать синхронный метод.

У вас есть решение или предложение?

Совет: я хочу использовать асинхронный метод из-за блокировки ввода-вывода. (Нет привязки к процессору или тяжелых операций.)

Комментарии:

1. Должно быть, в MyMethod выполняется довольно сложная проверка.

2. @Enigmativity Нет, проблема в блокировке ввода-вывода.

3. Да, ввод-вывод был бы сложной проверкой.

Ответ №1:

Использовать метод async в атрибуте пользовательской проверки

Конвейер проверки не является асинхронным, поэтому его невозможно использовать для этой цели. Смотрите этот аналогичный поток.

Кроме того, как мы все знаем, проверка заключается в обеспечении правильности типа и значения, а не бизнес-правил, таких как оценка поля. Это должно быть применено на вашем бизнес-уровне / уровне данных, и вы могли бы попробовать использовать проверку jQuery или удаленный атрибут.

Ответ №2:

Вам нужно будет выбрать, тогда, если атрибут ValidationAttribute не поддерживает вызовы async / await, вам, возможно, придется перейти на синхронный режим, иначе у вас может быть вызов в вашем isValid метода async, но тогда он не будет заблокирован, и вы можете получить неверный результат.

Я не вижу никакого способа обойти это, поскольку вам нужно будет почти сразу узнать, является ли что-то действительным или недействительным. Вероятно, это причина, по которой атрибут ValidationAttribute их не распознает.

Вы могли бы изменить свою модель, а не расширять, и иметь событие isValidChecked или событие IsInvalid, которое запускается при изменении деталей из async, а затем что-то делать, когда эти события запускаются.