Внедрение зависимостей с помощью атрибутов в .NET API
Внедрение зависимостей, вероятно, является одной из лучших функций, которые мы имеем в .NET на данный момент. Ни в коем случае вы не сможете его не использовать, поэтому, если вы похожи на меня, вам наверняка захочется добавить его во все создаваемые вами реализации.
Фильтры согласно официальной [документации] Microsoft(https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1):
Фильтры в ASP.NET Core позволяют запускать код до или после определенных этапов конвейера обработки запросов.
Встроенные фильтры решают такие задачи, как:
Авторизация, предотвращающая доступ к ресурсам, к которым пользователь не авторизован.
- Кэширование ответов, замыкание конвейера запросов для возврата кэшированного ответа.
Могут быть созданы пользовательские фильтры для решения сквозных задач. Примеры сквозных проблем включают обработку ошибок, кэширование, настройку, авторизацию и ведение журнала. Фильтры позволяют избежать дублирования кода.
Я много работаю с API, и есть некоторые вещи, которые должны выполнять каждый отдельный запрос или почти все из них, поэтому в идеале мы хотим работать с ним плюс… внедрение зависимостей!
Но иногда это небольшая хитрость: это не работает так, как мы хотим, если мы хотим наследовать от ActionAttribute поэтому нам нужно работать с TypeFilterAttribute, что позволяет нам делать что-то при переопределении OnActionExecutionAsync.
Обычно я создаю эти фильтры для ведения журналов, поэтому мы будем использовать их в качестве примера:
[[[ТОК_4]]]
Логика довольно проста: мы получаем тело, обращаясь к объекту context с помощью context.ActionArguments.First().Value, а также получаем вызов метода с помощью context.HttpContext.Request.Path.Value.
Затем мы просто вызываем наш метод из нашего сервиса, в данном случае это _loggingService.LogCustomEvent(call).
Затем мы должны вызвать await next();, потому что конвейер должен продолжить работу.
Это атрибут, теперь мы должны включить этот атрибут в метод.
[[[ТОК_10]]]
Надеюсь, вам понравилось. Если у вас есть какие-либо вопросы или вы хотите связаться со мной, не стесняйтесь и свяжитесь со мной!