Я написал собственный валидатор DataAnnotations (для клиента и сервера):
public class CustomAttribute : ValidationAttribute, IClientModelValidator { /* ... */ }
Однако в документации показан альтернативный подход, использующий три класса:
public class CustomAttribute : ValidationAttribute { /* ... */ }
public class CustomAttributeAdapter : AttributeAdapterBase<CustomAttribute> { /* ... */ }
public class CustomAttributeAdapterProvider : IValidationAttributeAdapterProvider { /* ... */ }
И еще нужно зарегистрировать провайдера при запуске:
services.AddSingleton<IValidationAttributeAdapterProvider, CustomAttributeAdapterProvider>();
Мой более простой способ работает, и я даже не регистрирую его в контейнере.
Почему документы показывают этот более сложный подход? Есть ли какая-то дополнительная функция или поведение, которого мне не хватает?
@JeremyLakeman Спасибо. Да, я наконец это понял... Атрибуты принимают только константы времени компиляции, но мне нужно было передать данные базы данных в валидатор. Так я понял, что именно для этого и нужны все остальные занятия. Упоминаемая вами инкапсуляция также полезна.





Мой более простой способ работает, и я даже не регистрирую его в контейнере.
Почему документы показывают этот более сложный подход? Есть ли какая-то дополнительная функция или поведение, которого мне не хватает?
В документе 🔁, на который вы ссылались, перечислены различия в использовании пользовательского атрибута проверки, который наследуется от ValidationAttribute и IClientModelValidator, с использованием дополнительных AttributeAdapter и ValidationAttributeAdapterProvider:
Создайте класс, производный от AttributeAdapterBase<TAttribute> и
класс, реализующий IValidationAttributeAdapterProvider, и
зарегистрируйте свой атрибут и его адаптер в DI. Этот метод следует
принцип единой ответственности в отношении серверов и
код проверки, связанный с клиентом, находится в отдельных классах. Адаптер
также имеет то преимущество, что, поскольку он зарегистрирован в DI, другие
при необходимости ему доступны службы в DI.
Внедрите IClientModelValidator в свой ValidationAttribute класс.
Этот метод может подойти, если атрибут не выполняет никаких действий.
проверка на стороне сервера и не требует никаких услуг от DI.
Потому что
IAttributeAdapterможет вставлять контент в html для проверки на стороне клиента для атрибутов, которые не реализуютсяIClientModelValidator. Таким образом, вы можете написать атрибуты проверки, которые ничего не знают о html/javascript, чтобы разделить эти проблемы. например,CustomAttributeможет существовать в сборке без зависимости от Microsoft.AspNetCore.