Sobes.tech
Junior

Šta je dependency injection (DI)?

sobes.tech АИ

Одговор од АИ

Umetanje zavisnosti (DI) je obrazac dizajna u kojem se zavisnosti komponenti obezbeđuju spolja, a ne same kreiraju. Ovo omogućava veću fleksibilnost, testabilnost i održivost koda.

Osnovni principi:

  • Inverzija kontrole (IoC): Komponenta ne upravlja kreiranjem svojih zavisnosti.
  • Razdvajanje odgovornosti: Kreiranje zavisnosti je odvojeno od njihove upotrebe.

Prednosti DI:

  • Poboljšana testabilnost: Lako je zameniti prave zavisnosti testnim mock-ovima.
  • Smanjenje povezanosti: Komponente postaju manje zavisne jedna od druge.
  • Veća fleksibilnost i ponovna upotrebljivost: Lako je promeniti implementaciju zavisnosti bez promene koda komponente.
  • Pojednostavljeno upravljanje zavisnostima: Posebno u velikim projektima.

Načini implementacije DI u Androidu:

  1. Ručno (Manual DI): Zavisnosti se prosleđuju kroz konstruktor ili putem settera.
  2. Korišćenjem framework-ova: Dagger 2, Hilt, Koin. Ovi framework-ovi automatizuju proces kreiranja i obezbeđivanja zavisnosti.

Primer ručno:

// Zavisnost
interface AnalyticsManager {
    fun trackEvent(eventName: String)
}

// Implementacija zavisnosti
class FirebaseAnalyticsManager : AnalyticsManager {
    override fun trackEvent(eventName: String) {
        // Logika praćenja u Firebase
    }
}

// Komponenta koja zahteva zavisnost
class UserRepository(private val analyticsManager: AnalyticsManager) { // Zavisnost se prosleđuje kroz konstruktor
    fun getUser(userId: String): User? {
        analyticsManager.trackEvent("UserFetched")
        // Logika dobijanja korisnika
        return null
    }
}

// Mesto gde se objekti kreiraju i povezuju
fun main() {
    val analytics: AnalyticsManager = FirebaseAnalyticsManager()
    val userRepository = UserRepository(analytics) // Injektovanje zavisnosti
}