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:
- Utilizar
lazy valpara inicialização adiada. - 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
@moduleestá 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.