Несколько способов написания пользовательских валидаторов DataAnnotations

Я написал собственный валидатор DataAnnotations (для клиента и сервера):

public class CustomAttribute : ValidationAttribute, IClientModelValidator { /* ... */ }

Однако в документации показан альтернативный подход, использующий три класса:

public class CustomAttribute : ValidationAttribute { /* ... */ }

public class CustomAttributeAdapter : AttributeAdapterBase<CustomAttribute> { /* ... */ }

public class CustomAttributeAdapterProvider : IValidationAttributeAdapterProvider { /* ... */ }

И еще нужно зарегистрировать провайдера при запуске:

services.AddSingleton<IValidationAttributeAdapterProvider, CustomAttributeAdapterProvider>();

Мой более простой способ работает, и я даже не регистрирую его в контейнере.

Почему документы показывают этот более сложный подход? Есть ли какая-то дополнительная функция или поведение, которого мне не хватает?

Потому что IAttributeAdapter может вставлять контент в html для проверки на стороне клиента для атрибутов, которые не реализуются IClientModelValidator. Таким образом, вы можете написать атрибуты проверки, которые ничего не знают о html/javascript, чтобы разделить эти проблемы. например, CustomAttribute может существовать в сборке без зависимости от Microsoft.AspNetCore.

Jeremy Lakeman 04.04.2024 05:02

@JeremyLakeman Спасибо. Да, я наконец это понял... Атрибуты принимают только константы времени компиляции, но мне нужно было передать данные базы данных в валидатор. Так я понял, что именно для этого и нужны все остальные занятия. Упоминаемая вами инкапсуляция также полезна.

lonix 04.04.2024 07:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой более простой способ работает, и я даже не регистрирую его в контейнере.

Почему документы показывают этот более сложный подход? Есть ли какая-то дополнительная функция или поведение, которого мне не хватает?

В документе 🔁, на который вы ссылались, перечислены различия в использовании пользовательского атрибута проверки, который наследуется от ValidationAttribute и IClientModelValidator, с использованием дополнительных AttributeAdapter и ValidationAttributeAdapterProvider:

  • Создайте класс, производный от AttributeAdapterBase<TAttribute> и класс, реализующий IValidationAttributeAdapterProvider, и зарегистрируйте свой атрибут и его адаптер в DI. Этот метод следует принцип единой ответственности в отношении серверов и код проверки, связанный с клиентом, находится в отдельных классах. Адаптер также имеет то преимущество, что, поскольку он зарегистрирован в DI, другие при необходимости ему доступны службы в DI.

  • Внедрите IClientModelValidator в свой ValidationAttribute класс. Этот метод может подойти, если атрибут не выполняет никаких действий. проверка на стороне сервера и не требует никаких услуг от DI.

Другие вопросы по теме