Olá Diego, tudo bem? É ótimo ver que você está buscando entender mais sobre injeção de dependência em JavaScript!
Desculpe a demora em retornar.
De fato, utilizar injeção de dependência é uma boa prática de programação, pois isso reduz o acoplamento entre as classes e torna o código mais testável e escalável. Quando você utiliza injeção de dependência, a classe dependente não precisa saber como criar suas dependências, ela apenas as recebe já instanciadas.
No exemplo que você mencionou, o NegociaçãoService é instanciado diretamente no método ao invés de ter sido passado como uma dependência para a classe. Embora isso possa funcionar em algumas situações, como quando a classe só precisa de uma instância dessa dependência, é geralmente uma boa prática utilizar injeção de dependência para reduzir o acoplamento.
Para refatorar o controller utilizando injeção de dependência, primeiro você precisa decidir como vai fornecer a instância do NegociaçãoService para a classe. Existem várias formas de fazer isso, mas uma maneira comum é utilizar um container de injeção de dependência, como o InversifyJS, ou até mesmo implementar um container de dependência simples por conta própria.
Vamos ver um exemplo simples de como implementar injeção de dependência utilizando o padrão Factory. Primeiro, criamos a classe NegociaçãoService e a interface INegociaçãoService:
class NegociaçãoService {
async obterNegociações() {
// implementação da função obterNegociações
}
}
interface INegociaçãoService {
obterNegociações(): Promise<Negociação[]>;
}
Em seguida, criamos a classe NegociaçãoServiceFactory, que é responsável por criar uma instância de NegociaçãoService:
class NegociaçãoServiceFactory {
static create() {
return new NegociaçãoService();
}
}
Por fim, criamos a classe Controller, que depende de uma instância de INegociaçãoService. Ao invés de criar uma instância diretamente, utilizamos a factory para criar uma instância de NegociaçãoService:
class Controller {
constructor(negociaçãoServiceFactory) {
this.negociaçãoService = negociaçãoServiceFactory.create();
}
async obterNegociações() {
const negociações = await this.negociaçãoService.obterNegociações();
// implementação do método obterNegociações
}
}
Dessa forma, a classe Controller não precisa saber como criar uma instância de NegociaçãoService, ela apenas recebe uma instância já criada. Para utilizar a classe Controller, podemos criar uma instância de NegociaçãoServiceFactory e passá-la para o construtor:
const negociaçãoServiceFactory = new NegociaçãoServiceFactory();
const controller = new Controller(negociaçãoServiceFactory);
controller.obterNegociações();
Espero que essa explicação tenha sido útil para você entender melhor como utilizar injeção de dependência em JavaScript.
Um abraço e bons estudos.