NodeJS — Injeção de dependência — com Vanilla JS

Leonardo Gerheim
gb.tech
Published in
3 min readDec 16, 2022
Pequeno boneco segurando uma seringa de injeção
Pequeno boneco segurando uma seringa de injeção | Foto de Manuel Chinchilla na Unsplash

Ao longo dos anos muitas técnicas de desenvolvimento de software foram criadas e algumas tiveram notoriedade. Tais técnicas surgem pela repetição desses problemas e por sua vez, uma solução padrão para suas subsequentes aparições. Esse é o caso da injeção de dependência.

Ao longo da vida de desenvolvedor de software uma pessoa é exposta à várias técnicas onde algumas dessas formarão o seu arcabouço de um profissional cada dia mais experiente. Não devemos pensar que devemos aplicar todas essas técnicas em um só software mas aplicar aquele velho ditado: "menos é mais".

Assim sendo, com a injeção de dependência podemos resolver um problema que temos diariamente:

Como testar um micro-serviço sem precisar conectar ao nosso banco de dados de produção.

Imaginemos um contexto de um pequeno sistema de cadastro de usuários utilizando express, um banco de dados no-sql qualquer e o Jest para testes. Uma arquitetura bem simples utilizando MVC ficaria como abaixo.

Simple MVC project architecture.

O fluxo dessa aplicação seria bem direto, o server é inicializado no arquivo de mesmo nome, que referencia os endpoints do arquivo routes que por sua vez executa as regras de negócio implementadas no arquivo user-handler.js

Abaixo vemos no arquivo server.js que tanto banco de dados como a aplicação possuem um forte acoplamento, ou seja, quando iniciamos o servidor, automaticamente conectamos com o banco de dados definido no arquivo.

A ideia de usar Dependency Injection é criar um app e literalmente injetá-lo em nosso servidor fazendo assim com essa dependência "flua" por todo o sistema. Assim podemos fazer fluir a dependência que quisermos, nesse caso o nosso banco de dados e a própria aplicação. Isso nos permitirá poder usar o supertest para criar uma nova instância do servidor em tempo de execução dos testes e injetar um banco de dados diferente daquele de produção, nesse caso um banco de dados "mockado".

Production and Tests system diagram.

O diagrama acima demonstra que durante o processo de testes vamos instanciar um novo servidor com o supertest e injetar outro banco de dados, nesse caso um banco de dados que não é o de produção.

Vamos alterar nossa primeira versão do arquivo server.js dividindo-o em dois arquivos server.js e app.js como demonstrado abaixo.

server.js após desmembramento.
app.js após desmembramento.

Vemos na linha 1 de app.js que importamos server.js e na linha 10 que passamos nosso modelo de dados injetado como dependência. Dessa forma abrimos caminho para quando estivermos em ambiente de teste, utilizarmos a mesma "brecha" para injetarmos um outro banco de dados. Vejamos isso no código abaixo.

Na linha 2 observamos a importação de server.js e na linha 21 a injeção de nosso banco de dados fictício.

O uso da injeção de dependência é provavelmente a recomendação que podemos ver mais diretamente seu benefício e aquela que nos ajuda diariamente na tarefa de testes por exemplo.

Espero que possa ter clareado seu entendimento sobre essa técnica eghf espero mais ainda que você possa aplicar isso no seu dia a dia. O código completo pode ser encontrado em meu repositório do Github.

Até a próxima.

--

--