Referencia: Inyección de Dependencias
Wabot usa tsyringe como contenedor DI. Las exportaciones relevantes vienen de @wabot-dev/framework.
import { singleton, injectable, scoped, Lifecycle, container } from '@wabot-dev/framework'Decoradores de ciclo de vida
@singleton()
Una única instancia compartida en toda la aplicación. Ideal para servicios con estado global, repositorios y configuración.
@singleton()export class AppConfig { readonly apiKey = process.env.API_KEY!}@injectable()
Nueva instancia cada vez que se resuelve. Ideal para servicios sin estado o que deben ser independientes entre llamadas.
@injectable()export class PriceCalculator { calculate(price: number, qty: number): number { return price * qty }}@scoped(Lifecycle.ContainerScoped)
Una instancia por contenedor hijo. El framework crea contenedores hijo automáticamente por request HTTP, por conexión Socket y por chat. Úsalo para servicios con estado aislado por request.
import { scoped, Lifecycle } from '@wabot-dev/framework'
@scoped(Lifecycle.ContainerScoped)export class RequestContext { userId?: string}Resolución automática
Cualquier clase decorada con @singleton(), @injectable() o @scoped() se resuelve automáticamente cuando aparece en el constructor de otra clase inyectable.
@singleton()export class NotificacionService { constructor( private email: EmailService, // resuelto automáticamente private config: AppConfig, // resuelto automáticamente ) {}}No es necesario registrar manualmente los servicios — basta con que estén decorados.
container
Instancia global del contenedor DI. Úsala para resoluciones manuales o para registrar implementaciones.
container.resolve(Clase)
Resuelve una dependencia manualmente. Útil en el entry point de la aplicación.
import { container } from '@wabot-dev/framework'
const config = container.resolve(AppConfig)container.registerType(Abstracto, Concreto)
Registra una implementación concreta para una clase/interfaz abstracta. Se usa para elegir implementaciones en tiempo de arranque.
import { container, ChatAdapter, WabotChatAdapter } from '@wabot-dev/framework'
container.registerType(ChatAdapter, WabotChatAdapter)container.registerInstance(Clase, instancia)
Registra una instancia ya construida como singleton.
import { Pool } from 'pg'
container.registerInstance(Pool, new Pool({ connectionString: process.env.DATABASE_URL }))Inyección especial: @chatBot(MindsetClass)
Decorador de parámetro de constructor disponible dentro de @chatController(). Inyecta un ChatBot configurado con el mindset indicado.
import { chatBot, ChatBot } from '@wabot-dev/framework'
@chatController()export class MiController { constructor( @chatBot(MiMindset) private bot: ChatBot, ) {}}Decoradores registrados implícitamente
Estos decoradores aplican @injectable() o @singleton() internamente — no necesitas decorar la clase manualmente:
| Decorador | Lifecycle aplicado |
|---|---|
@mindset() | @injectable() |
@mindsetModule() | @injectable() |
@chatController() | @injectable() |
@restController() | @injectable() |
@socketController() | @injectable() |
@commandHandler() | @injectable() |
@cronHandler() | @singleton() |
@pgJsonRepository() | @singleton() |