inversify para TypeScript: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Inversify e para que serve?

\n\n

Inversify é um container IoC (Inversion of Control) poderoso e leve para TypeScript e JavaScript. Ele implementa o padrão Dependency Injection (DI), que é um dos princípios-chave do SOLID. O Inversify permite gerenciar dependências entre classes, tornando o código mais modular, testável e sustentável.

\n\n

Para que serve? Na programação tradicional, as classes criam suas próprias dependências (por exemplo, através de new). Isso leva a um forte acoplamento do código. O Inversify inverte esse processo: as dependências são "injetadas" de fora (daí o nome — Inversion of Control). O container assume a criação e o gerenciamento do ciclo de vida dos objetos.

\n\n

Principais vantagens de usar Inversify:

\n
    \n
  • Baixo acoplamento: As classes dependem de abstrações (interfaces), não de implementações concretas.
  • \n
  • Testes fáceis: Você pode substituir facilmente dependências reais por mocks/stubs nos testes.
  • \n
  • Gerenciamento do ciclo de vida: O container pode criar objetos como singletons ou novas instâncias a cada vez.
  • \n
  • Legibilidade e sustentabilidade: Todas as dependências são explicitamente declaradas e facilmente rastreáveis.
  • \n
  • Escalabilidade: Ideal para grandes projetos com muitos módulos.
  • \n
\n\n

Instalação do Inversify

\n\n

O Inversify é instalado via npm. Para trabalhar com TypeScript, também é necessário instalar reflect-metadata (biblioteca para trabalhar com decoradores) e configurar o tsconfig.json.

\n\n
# Instalação do Inversify e reflect-metadata\nnpm install inversify reflect-metadata --save\n\n# Instalação dos tipos para TypeScript (se não estiverem instalados)\nnpm install @types/node --save-dev\n
\n\n

Configuração do tsconfig.json:

\n
{\n  "compilerOptions": {\n    "target": "ES6",\n    "module": "commonjs",\n    "experimentalDecorators": true,\n    "emitDecoratorMetadata": true,\n    "strict": true,\n    "esModuleInterop": true,\n    "skipLibCheck": true,\n    "forceConsistentCasingInFileNames": true,\n    "outDir": "./dist",\n    "rootDir": "./src",\n    "types": ["reflect-metadata"]\n  },\n  "include": ["src/**/*"],\n  "exclude": ["node_modules", "dist"]\n}\n
\n\n

Importante: Os decoradores @injectable() e @inject() funcionam apenas com experimentalDecorators e emitDecoratorMetadata habilitados.

\n\n

Início rápido com exemplo de código

\n\n

Vamos criar um exemplo simples: um serviço para enviar notificações. Teremos uma interface INotificationService, sua implementação EmailNotificationService e uma classe UserService que usa este serviço.

\n\n
// 1. Importamos os módulos necessários\nimport "reflect-metadata";\nimport { Container, injectable, inject } from "inversify";\n\n// 2. Definimos a interface (abstração)\ninterface INotificationService {\n  send(message: string): void;\n}\n\n// 3. Implementação da interface\n@injectable()\nclass EmailNotificationService implements INotificationService {\n  send(message: string): void {\n    console.log(`Enviando email: ${message}`);\n  }\n}\n\n// 4. Classe que depende de INotificationService\n@injectable()\nclass UserService {\n  private notificationService: INotificationService;\n\n  constructor(\n    @inject("INotificationService") notificationService: INotificationService\n  ) {\n    this.notificationService = notificationService;\n  }\n\n  notifyUser(userId: string): void {\n    this.notificationService.send(`Notificação para o usuário ${userId}`);\n  }\n}\n\n// 5. Criamos o container e registramos as dependências\nconst container = new Container();\ncontainer.bind
                
    
    

Recommendations