O que é Inversify e para que serve?
\n\nInversify é 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\nPara 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.
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
Instalação do Inversify
\n\nO 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.
# 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\nConfiguraçã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\nImportante: Os decoradores @injectable() e @inject() funcionam apenas com experimentalDecorators e emitDecoratorMetadata habilitados.
Início rápido com exemplo de código
\n\nVamos 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.
// 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
Também na biblioteca
ORM para PHP: comparação entre Doctrine, Eloquent e Propel com exemplos
Geração Swagger/OpenAPI para TypeScript: melhores ferramentas
Trabalho com XML em Java: bibliotecas e ferramentas para parsing
Gerador de QR Code em C++ com libqrencode e CQRcode
Geração Swagger/OpenAPI para Java: bibliotecas e ferramentas
Recommendations