Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Injeção de dependência

Como fica a questão das injenções de dependências com JS?

Por exemplo, nesse capítulo o NegociaçãoService foi instanciado diretamente no método em vez de ter sido passado como uma depêndencia para classe, mas imagino que não seja uma boa prática, principalmente pelas questões de testes, acomplamento, etc. Faria sentido eu refatorar o meu controller usando as injenções de dependências?

Ficaria grato se alguém me der algum esclarecimento :)

1 resposta
solução!

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.