Contêineres de Injeção de Dependência para Kotlin: visão geral completa e comparação
Injeção de Dependência (DI) é um padrão chave no desenvolvimento moderno, que permite criar aplicações com baixo acoplamento, testáveis e escaláveis. No ecossistema Kotlin, existem vários contêineres DI poderosos, cada um com suas características. Neste artigo, analisaremos detalhadamente as três soluções mais populares: Koin, Kodein-DI e Dagger/Hilt. Você aprenderá como funcionam, quais são seus pontos fortes e fracos, e qual ferramenta escolher para o seu projeto.
O que é um contêiner de Injeção de Dependência?
Um contêiner DI é um framework que gerencia a criação e o ciclo de vida dos objetos (dependências) e os injeta automaticamente nas classes. Em vez de criar dependências manualmente através de um construtor ou fábrica, você descreve as regras de montagem em módulos, e o contêiner cuida de todo o trabalho pesado. Isso é especialmente útil em projetos grandes com centenas de classes.
1. Koin — DI leve e simples para Kotlin
Koin é um contêiner DI orientado a DSL, escrito em Kotlin puro. Ele não requer geração de código, reflexão ou anotações. Todas as configurações são feitas através de uma DSL (Domain Specific Language) conveniente.
Instalação
// build.gradle.ktsimplementation("io.insert-koin:koin-core:3.5.3")Exemplo de uso
// Definindo dependênciasval appModule = module { single { HttpClient() } factory { UserRepository(get()) }}
// Iniciando o Koinfun main() { startKoin { modules(appModule) } // Obtendo a dependência val repo: UserRepository by inject()}
class UserRepository(private val client: HttpClient)Prós:
- Curva de aprendizado mínima — sem anotações, sem geração de código
- Fácil integração com Android (Koin Android)
- Suporte a escopos (Scope API)
- Compilação rápida
Contras:
- Erros são detectados apenas em tempo de execução
- Não há verificação do grafo de dependências em tempo de compilação
- Um pouco mais lento que o Dagger em tempo de execução devido à reflexão
2. Kodein-DI — flexível e multiplataforma
Kodein-DI é outro framework DI em Kotlin puro. Ele oferece recursos avançados: suporte a projetos multiplataforma (KMP), inicialização tardia, marcação de dependências e fábricas integradas.
Exemplo de configuração
val di = DI { bind<ApiService>() with singleton { RetrofitApiService() } bind<Logger>() with provider { ConsoleLogger() } bind<UserRepository>() with factory { UserRepositoryImpl(instance()) }}
// Usoclass MainActivity { private val repo: UserRepository by di.instance()}Prós:
- Suporte completo a Kotlin Multiplatform (iOS, JS, JVM)
- Sistema poderoso de tags e modificadores
- Possibilidade de criar contêineres aninhados
- Suporte a escopos e segurança de thread
Contras:
- Menos popular que o Koin (menos comunidade e tutoriais)
- A DSL pode parecer sobrecarregada para projetos simples
- Também verificação de dependências em tempo de execução
3. Dagger / Hilt — DI de alto desempenho do Google
Dagger e seu wrapper para Android Hilt são frameworks DI baseados em geração de código durante a compilação. Eles usam anotações (@Inject, @Module, @Component) e criam todo o código de ligação antecipadamente. Isso proporciona desempenho máximo em tempo de execução.
Exemplo com Hilt
@HiltAndroidAppclass MyApplication : Application()
@AndroidEntryPointclass MainActivity : AppCompatActivity() { @Inject latein Também na biblioteca
Agendador de tarefas em TypeScript: biblioteca node-schedule
Trabalhando com XML em JavaScript (Node.js): bibliotecas e exemplos
Filas de Tarefas em Java: Visão Geral e Implementação com java.util.concurrent
OpenAPI / Swagger para Java: guia completo com exemplos