Внедрение зависимостей с помощью атрибутов в .NET API

· 2 мин чтения

Внедрение зависимостей, вероятно, является одной из лучших функций, которые мы имеем в .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]]]

Надеюсь, вам понравилось. Если у вас есть какие-либо вопросы или вы хотите связаться со мной, не стесняйтесь и свяжитесь со мной!