Sobes.tech
Junior

O que é injeção de dependência (DI)?

sobes.tech IA

Resposta da IA

A Injeção de Dependências (DI) é um padrão de projeto em que as dependências de um componente são fornecidas de fora, em vez de serem criadas por ele próprio. Isto permite maior flexibilidade, testabilidade e facilidade de manutenção do código.

Princípios básicos:

  • Inversão de controlo (IoC): O componente não gere a criação das suas dependências.
  • Separação de responsabilidades: A criação das dependências está separada do seu uso.

Vantagens da DI:

  • Melhor testabilidade: É fácil substituir dependências reais por mocks em testes.
  • Redução do acoplamento: Os componentes tornam-se menos dependentes uns dos outros.
  • Maior flexibilidade e reutilização: É fácil alterar a implementação de uma dependência sem modificar o código do componente.
  • Gestão simplificada de dependências: Especialmente em projetos grandes.

Formas de implementar DI em Android:

  1. Manual (DI manual): As dependências são passadas no construtor ou através de setters.
  2. Usando frameworks: Dagger 2, Hilt, Koin. Estes frameworks automatizam o processo de criação e fornecimento de dependências.

Exemplo manual:

// Dependência
interface AnalyticsManager {
    fun trackEvent(eventName: String)
}

// Implementação da dependência
class FirebaseAnalyticsManager : AnalyticsManager {
    override fun trackEvent(eventName: String) {
        // Lógica de tracking no Firebase
    }
}

// Componente que necessita da dependência
class UserRepository(private val analyticsManager: AnalyticsManager) { // A dependência é passada através do construtor
    fun getUser(userId: String): User? {
        analyticsManager.trackEvent("UserFetched")
        // Lógica para obter o utilizador
        return null
    }
}

// Local onde os objetos são criados e ligados
fun main() {
    val analytics: AnalyticsManager = FirebaseAnalyticsManager()
    val userRepository = UserRepository(analytics) // Injeção de dependência
}