ASP.NET Core Пользовательская проверка базы данных
Мне нужно проверить поле в базе данных, возможно, с использованием других зарегистрированных служб. Я читал документацию, но не нашел фактического ответа.
Существует удаленная проверка, которая вызывает метод контроллера, но это только на стороне клиента, поэтому отключение JS отключает проверку. Существует также настраиваемая проверка, которая использует атрибуты проверки и приятно содержится в ModelState.IsValid
но я не могу ввести зависимости в его конструктор.
Я обнаружил, что этот вопрос помечен как ответивший, поскольку он говорит о средстве разрешения зависимостей, но я не могу найти какую-либо полезную информацию о нем.
Я попытался исследовать это, но все, с чем я сталкивался, было только об инъекциях зависимости или 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 был нулевым. Я действительно исчерпал все идеи здесь и буду благодарен за любую помощь.
1 ответ
Я сталкиваюсь с подобной проблемой. Я попробовал несколько "пятнистых" способов (на всякий случай, если вам "придется"). Как будто я застрял с моим атрибутом DuplicateMatch для электронной почты - который нуждался в доступе к базе данных, и ничего не было доступно в моем пользовательском атрибуте validationAttribute.
- Мой DAL - это отдельный проект, поэтому вместо чистого DI(внедрение зависимостей) - я сохранил инициализацию DBConext в DAL (у него есть свой собственный appSettings.json), так что никто больше не беспокоится о передаче DBContext и т. Д... просто вызов DAL (или уровень обслуживания), и он сможет самостоятельно инициировать DBContext.
- Каким-то образом используйте шаблон "Service Locator" для получения экземпляра DBContext и любых других объектов, которые были настроены для DI - еще не протестированы.
- Повинуйтесь шаблону DI и выполняйте мой DuplicateMatch или любую другую такую проверку (которая требует доступа DAL в самом действии контроллера или на уровне обслуживания), а не с атрибутом проверки.
Дайте мне знать, если это поможет. И мне было бы интересно узнать от сообщества больше о способах (таких как 3.), которые не нарушают шаблон DI.