Внедрить зависимости в атрибут аттестации Web Api Asp.Net Core
Я создаю пользовательский атрибут проверки в Asp.Net Core Web Api. Мне нужен доступ к IDataProtector в моем валидаторе и другом сервисе, который я использую для доступа к базе данных. Я искал и не нашел никакой документации для этого. У ActionFilter есть опция использования ServiceFilter, но, похоже, нет никакой опции для атрибута проверки. Есть идеи?
4 ответа
Поскольку атрибуты проверки обычно определяются в свойствах, они не могут получить ссылку через конструктор. В лучшем случае, если вы действительно глубоко погрузились в привязку модели, может быть что-то настроить, чтобы разрешить внедрение свойства, но практически я просто получаю ссылку на средство разрешения зависимостей в методе Validate и вызываю соответствующий метод.
Используйте метод GetService() ValidationContext для получения вашей базы данных. т.е.
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
MyDbContext db = (MyDbContext) validationContext.GetService(typeof(MyDbContext));
//...
}
Вы можете переопределить метод IsValid и использовать validationContext для разрешения зависимости:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = (IExternalService) validationContext.GetService(typeof(IExternalService));
// use service
}
У нас было аналогичное требование, когда требовалось передать дополнительные данные атрибуту, чтобы обеспечить достаточный контекст для его проверки.
Мы придумали способ создания объекта контекста, который можно было бы передать атрибутам. Я написал об этом здесь.
Мы используем async api для доступа к данным, что создает некоторые дополнительные проблемы.