ДокументацияМодульный маршрутизатор
Внедрение зависимостей
Nexy разрешает зависимости конструкторов для контроллеров и сервисов. Класс соглашается с @Injectable().
Внедрить сервис
from nexy.decorators import Injectable @Injectable()class UserService: def get_all(self) -> list[dict]: return [{"id": 1, "name": "Ada"}]from nexy.decorators import Controllerfrom .user_service import UserService @Controller("/users")class UserController: def __init__(self, svc: UserService) -> None: self.svc = svc def get(self) -> list[dict]: return self.svc.get_all()Зарегистрируйте контроллер в модуле. Листинг службы в providers дополнительно разрешает ее при запуске:
from nexy.decorators import Modulefrom .user_controller import UserControllerfrom .user_service import UserService @Module()class UsersModule: controllers = [UserController] providers = [UserService]Как работает разрешение
- Каждый параметр
__init__определяется на основе его аннотации типа ****. Аннотация должна быть классом@Injectable()или параметр должен иметь значение по умолчанию; в противном случае разрешение повышаетValueError. - Контроллеры создаются с помощью
Container.resolve()при запуске. - Цикл зависимостей вызывает
RecursionErrorимя класса. - Сервисы могут внедрять другие сервисы на любую глубину.
Области применения
from nexy.decorators import Injectable, Scope @Injectable(scope=Scope.REQUEST)class CurrentUser: ...
| Область применения | Срок службы |
|---|---|
Scope.SINGLETON (по умолчанию) |
один экземпляр для всего процесса |
Scope.REQUEST |
один экземпляр на контекст запроса |
Scope.TRANSIENT |
новый экземпляр в каждом разрешении |
Контейнер
from nexy.decorators import Container service = Container.resolve(UserService)
Самостоятельное создание класса @Injectable() повышает TypeError: контейнер владеет своим жизненным циклом. Используйте Container.resolve(...) или получите класс через другой конструктор.
Container.clear_request_scope() удаляет экземпляры текущего запроса.
Параметры маршрута
FastAPI Depends работает как обычно для параметров обработчика, после внедрения конструктора:
from fastapi import Depends def get(self, limit: int = Depends(pagination)) -> list[dict]: ...
Пределы
Контейнер охватывает весь процесс. Провайдеры не изолированы для каждого модуля, exports только решает, каких провайдеров с готовностью разрешает импортирующий модуль, и не существует общедоступного API для замены провайдера в тестах. См. Nexy и NestJS для полного сравнения.