Dependency injection в FastAPI представляет собой мощный механизм для управления зависимостями, особенно полезный для работы с сессиями базы данных. Зависимость определяется как генераторная функция, которая создает ресурс, передает его в обработчик через yield, а после завершения запроса выполняет очистку. Для сессий базы данных типичная зависимость создает асинхронную сессию, обеспечивает автоматический коммит при успешном выполнении или откат при ошибке, и гарантирует закрытие соединения. Этот паттерн обеспечивает правильное управление транзакциями и предотвращает утечки соединений.
На рисунке 1 представлен пример dependency injection для сессий.

Рисунок 1. Dependency injection для управления сессиями
Функция get_db автоматически управляет жизненным циклом сессии: создает, коммитит при успехе, откатывает при ошибке и закрывает. FastAPI инъектирует сессию в каждый endpoint через параметр Depends.
Repository pattern инкапсулирует логику доступа к данным, создавая слой абстракции между бизнес-логикой и ORM. Repository представляет собой класс, содержащий методы для выполнения операций с конкретной сущностью. Этот паттерн упрощает тестирование, так как repository легко заменяется mock-объектом, и повышает переиспользуемость кода, избегая дублирования запросов. Repository также обеспечивает единую точку для оптимизации запросов и управления стратегиями загрузки данных.
На рисунке 2 представлен пример repository pattern.

Рисунок 2. Repository pattern для инкапсуляции логики доступа к данным
Repository содержит все операции с Commission, изолируя детали работы с БД от бизнес-логики. Методы легко тестируются и переиспользуются.
Обработка транзакций и ошибок требует особого внимания для обеспечения целостности данных. Транзакция представляет собой логическую единицу работы, которая либо выполняется полностью, либо откатывается целиком при возникновении ошибки. В FastAPI с dependency injection транзакция автоматически коммитится при успешном завершении обработчика или откатывается при исключении. Для сложных операций, требующих нескольких шагов, можно использовать явные точки сохранения через savepoint или вложенные транзакции. Правильная обработка специфических исключений SQLAlchemy, таких как IntegrityError для нарушения ограничений, позволяет возвращать клиенту информативные сообщения об ошибках.
Dependency injection элегантно решает задачу управления жизненным циклом сессий, автоматизируя создание, коммит и закрытие соединений. Repository pattern инкапсулирует логику доступа к данным, повышая тестируемость и переиспользуемость кода. Правильная обработка транзакций и ошибок обеспечивает целостность данных и улучшает надежность приложения.
Список литературы
- Фаулер, М. Шаблоны корпоративных приложений [Текст] / М. Фаулер. – М.: Вильямс, 2019. – 544 с.
- Мартин, Р. Чистая архитектура. Искусство разработки программного обеспечения [Текст] / Р. Мартин. – СПб.: Питер, 2018. – 352 с.


