DocsEnrutador modular
inyección de dependencia
Nexy resuelve las dependencias del constructor para controladores y servicios. Una clase se inscribe con @Injectable().
Inyectar un servicio
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()Registre el controlador en un módulo. Incluir el servicio en providers también lo resuelve rápidamente al inicio:
from nexy.decorators import Modulefrom .user_controller import UserControllerfrom .user_service import UserService @Module()class UsersModule: controllers = [UserController] providers = [UserService]Cómo funciona la resolución
- Cada parámetro
__init__se resuelve a partir de su anotación de tipo. La anotación debe ser una clase@Injectable()o el parámetro debe tener un valor predeterminado; de lo contrario, la resolución planteaValueError. - Los controladores se crean instancias con
Container.resolve()al inicio. - Un ciclo de dependencia plantea
RecursionErrornombrar la clase. - Los servicios pueden inyectar otros servicios, a cualquier profundidad.
Alcances
from nexy.decorators import Injectable, Scope @Injectable(scope=Scope.REQUEST)class CurrentUser: ...
| Alcance | Toda la vida |
|---|---|
Scope.SINGLETON (predeterminado) |
una instancia para todo el proceso |
Scope.REQUEST |
una instancia por contexto de solicitud |
Scope.TRANSIENT |
una nueva instancia en cada resolución |
el contenedor
from nexy.decorators import Container service = Container.resolve(UserService)
La construcción de una clase @Injectable() usted mismo genera TypeError: el contenedor es dueño de su ciclo de vida. Utilice Container.resolve(...) o reciba la clase a través de otro constructor.
Container.clear_request_scope() elimina las instancias de la solicitud actual.
Parámetros de ruta
FastAPI Depends funciona como de costumbre para los parámetros del controlador, junto a la inyección del constructor:
from fastapi import Depends def get(self, limit: int = Depends(pagination)) -> list[dict]: ...
Límites
El contenedor abarca todo el proceso. Los proveedores no están aislados por módulo, exports solo decide qué proveedores resuelve con entusiasmo un módulo de importación y no hay una API pública para intercambiar un proveedor en las pruebas. Consulte Nexy y NestJS para obtener una comparación completa.