Внедрить зависимости в атрибут аттестации 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 для доступа к данным, что создает некоторые дополнительные проблемы.

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