¿Cómo usar la inyección de dependencias en TypeScript?
He intentado agregar inyección de dependencias en el código TypeScript, está funcionando bien. Pero necesito cargar la aplicación Express en la inyección de dependencias.
Dependencias.ts
import { injectable } from 'inversify';
@injectable()
export class DependencyA{
public getName(){
return "dependencyA"
}
}
@injectable()
export class DependencyB{
public getName(){
return "dependencyB"
}
}
Service.ts
import {injectable} from 'inversify';
import { DependencyA,DependencyB } from './dependencies';
@injectable()
export class Service{
dependencya: DependencyA;
dependencyb: DependencyB;
constructor(dependencya:DependencyA,dependencyb:DependencyB){
this.dependencya = dependencya;
this.dependencyb = dependencyb
}
public getAllName(){
return this.dependencya
}
}
main.ts
import 'reflect-metadata'
import { Service } from './service';
import {container} from 'tsyringe';
const service = container.resolve(Service)
console.log(service.getAllName)
cómo cargar la aplicación de Express en la inyección de dependencias y la aplicación de Express pasar el parámetro en el constructor de dependencias
Respuesta #1
Me aseguraría de que te apegues a inversify en toda tu aplicación y de usar el Container de inversify en lugar del contenedor de tsyringe.
También le señalaría este paquete (https://github.com/inversify/inversify-express-utils) que estoy usando con éxito en producción para una aplicación de express basada en servicios usando inyección de dependencias.
Puedes crear un InversifyExpressServer pasándole tu contenedor inversify y tu aplicación express personalizada de la siguiente manera
const container = new Container();
container.bind<MyServiceA>(TYPES.MyServiceA).to(MyServiceA)
container.bind<MyServiceB>(TYPES.MyServiceB).to(MyServiceB)
const app = express();
// apply middleware
app.use(middleware)
// any regular functional express routes
app.use('/', controllerFunc)
...etc etc
const server = new InversifyExpressServer(container, null, null, app);
InversifyExpressServer manejará la resolución de tu raíz ioc por ti y registrará todos tus controladores, todo lo que tienes que hacer es enlazar tus servicios al contenedor. Estos servicios estarán disponibles para @inject y se podrán usar en tus controladores (o en otros servicios)
@controller("/names")
export class NamesController extends HttpBaseController {
@inject(TYPES.MyServiceA) private myServiceA!: MyServiceA
@httpGet("/")
private index(): string {
return this.myServiceA.getAllNames();
}
}
Se integra bien con las aplicaciones existentes. Actualmente estoy migrando una aplicación Express con alrededor de 100 endpoints de una aplicación Express en JavaScript plano a una aplicación en TypeScript usando este paquete Inversify. Dado que puedes pasarle un InversifyExpressServer una aplicación personalizada, puedes mantener todas tus rutas antiguas allí totalmente funcionales hasta que las refactorices.
Alternativamente, si tu proyecto es nuevo, recomendaría echar un vistazo a Nestjs (https://nestjs.com/). Es un framework construido sobre Express con su propia inversión de dependencias incorporada, inspirada en Angular.
