Executando verificação de segurança...
1

Opa, muito bom o conteúdo. Trabalho com injeção de dependência desde a minha primeira experiência em código como profissional, pois onde trampo todos os Microservices usam o Awilix, que é justamente uma lib Node pra fazer parte desse processo.

Eu só fiquei pensativo sobre algo: Ingeção de dependência é o mesmo que inversão de dependência? Eu tinha pra mim que "inversão" era justamente a estratégia de desacoplamento de uma classe de suas dependências, sendo que as mesmas passam a ser recebidas por parâmetro e a classe só se preocupa em usar os métodos que desejar.

Já a "injeção" seria instanciar todas os módulos, talvez globalmente, para que as classes
não precisem sequer saber onde estão esses parâmetros.

Veja que, apesar da classe receber os módulos que precisa, o "arquivo" da classe ainda precisa saber exatamente onde se encontra aquele módulo. E se o módulo mudar de lugar? E se outras classes quiserem usar o mesmo módulo, todas vão ter que saber onde eles estão? Esse tipo de coisa, por exemplo, pode ser resolvido com libs como "Awilix", que infelizmente tem pouca documentação na internet. Com ferramentas como essa você pode indicar em quais pastas se encontram todos os módulos "públicos" e instanciá-los. Assim, cada classe que quiser usar, apenas precisa desustruturar o módulo desejado de uma "instância global".

Já o lance do Feature Flag (conheço como feature toggle") é muito legal. Não tinha pensado nessa estratégia. Show.

Peço desculpas se o raciocínio ficou confuso, mas acho que a ideia geral ficou minimamente clara.

Parabéns pelo post!!

Carregando publicação patrocinada...
1

Seu raciocínio está no caminho correto.

Acho que consigo ajudar a esclarecer alguns detalhes.

De fato, apesar de inversão de dependência (o "D" no SOLID) e injeção de dependência terem relação estreita um com o outro, como você mesmo observou, são coisas diferentes.

Inversão de dependência é sobre fazer seus serviços (palavra guarda-chuva pra significar funções, classes, objetos) não dependerem diretamente de implementações concretas, mas sim de abstrações, de maneira que um determinado serviço não conheça diretamente as dependências que está utilizando.

Injeção de dependência é uma técnica específica que pode ser utilizada pra alcançarmos a inversão de dependências, mas, dito isto, é possível usar injeção de dependência sem necessariamente estar "invertendo" elas.

Inclusive, na forma específica de injetar dependências que eu mostrei, acontece justamente isto, estamos injetando dependências sem inverter elas, dado que pelo fato desta injeção acontecer no mesmo arquivo que o serviço está sendo implementado, o serviço sabe exatamente quem são as suas dependêndencias e onde elas se encontram.

Isto foi proposital, porque como eu queria fazer uma breve introdução à injeção de dependência, achei mais proveitoso mostrar a técnica de um jeito que, ainda que simplificado, vai trazer vários benefícios.

Para alcançarmos inversão de dependências usando DI, a gente invariavelmente vai acabar caindo na necessidade de ter um container, que é o único lugar que vai saber sobre as implementações concretas de todas as dependências e vai plugar elas todas.

Mas ó, um ponto interessante é que não necessariamente a gente precisa de uma lib/framework de injeção de dependência pra termos um container, dá pra gente montar um container manualmente.

No artigo que eu citei no final do post, eu dou alguns exemplos disto: https://blog.codeminer42.com/dependency-injection-in-js-ts-part-1/