Macwire: Resolução de Problemas de Injeção de Dependência em Scala

Macwire é uma biblioteca leve e não intrusiva para injeção de dependência em Scala, oferecendo API concisa e segurança de tipos em tempo de compilação. Este guia aborda questões frequentes no uso do Macwire, focando na solução de desafios comuns de injeção de dependência.

Uso Básico

Como incluir o Macwire em um projeto SBT?
Adicione a dependência ao arquivo build.sbt. Exemplo com versão atualizada:

libraryDependencies += "com.softwaremill.macwire" %% "macros" % "2.6.0" % "provided"

Verifique a compatibilidade entre as versões do Scala e do Macwire para evitar conflitos.

Por que a injeção com o método wire falha?
Erros de compilação ocorrem quando:

  • A classe-alvo não possui um construtor público.
  • Os parâmetros do construtor não são resolvidos no escopo atual.
  • Existem dependências circulares não tratadas.

Para resolver, garanta que todas as dependências estejam disponíveis no módulo corrente, ajustando visibilidade ou importações.

Recursos Avançados

Gerenciando dependências circulares
O Macwire não suporta dependências circulares diretamente. Alternativas incluem:

  1. Utilizar lazy val para inicialização adiada.
  2. Introduzir interfaces intermediárias para desacoplamento.

Exemplo de desacoplamento usando traits:

trait ProvedorA {
  def fornecerA: ComponenteA
}

trait ProvedorB {
  def fornecerB: ComponenteB
}

class ImplementacaoA(b: ComponenteB) extends ProvedorA {
  override def fornecerA: ComponenteA = new ComponenteA(b)
}

Modularização em projetos grandes
Divida a aplicação em traits modulares para facilitar o compartilhamento de dependências:

trait ModuloAutenticacao {
  lazy val servicoAutenticacao = wire[ServicoAutenticacao]
}

trait ModuloPerfil extends ModuloAutenticacao {
  lazy val gerenciadorPerfil = wire[GerenciadorPerfil]
}

Essa abordagem promove reutilização e manutenção simplificada.

Erros em Tempo de Compilação

Depurando erros de resolução de dependências
Ao receber erros como "Could not find a value of type", verfiique:

  • Se o tipo da dependência está acessível no escopo.
  • Se há múltiplas instâncias do mesmo tipo, o que pode causar ambiguidade.
  • Se o uso de anotações como @module está definindo limites claros.

Consulte o código-fonte do Macwire para entender a lógica de resolução de dependências.

Compatibilidade com Scala 3
A versão do Macwire para Scala 3 utiliza macros atualizadas e melhor inferência de tipos. Recomenda-se usar a variante específica do Scala 3 para otimizações, localizada no diretório macros/src/main/scala-3/.

Melhores Práticas

Substituindo dependências em testes
Use sobreposição de módulos para mocks em testes unitários:

trait ModuloTesteAutenticacao extends ModuloAutenticacao {
  override lazy val servicoAutenticacao = mock[ServicoAutenticacao]
}

Isso permite isolar componentes durante os testes.

Integração com outros frameworks
O Macwire se integra a ecossistemas como Akka e Cats. Módulos específicos fornecem estratégias de injeção adaptadas:

  • Akka: Suporte em macrosAkka/src/main/scala/com/softwaremill/macwire/akkasupport/.
  • Cats: Extensões em macrosAutoCats/src/main/scala/com/softwaremill/macwire/autocats/.

Essas integrações simplificam o gerenciamento de dependências em aplicações complexas.

Tags: Scala macwire dependency-injection macros sbt

Publicado em 7-3 22:25