Sobes.tech
Junior

Wat is dependency injection (DI)?

sobes.tech AI

Antwoord van AI

Dependency Injection (DI) is een ontwerppatroon waarbij de afhankelijkheden van een component van buitenaf worden geleverd, in plaats van dat ze door de component zelf worden gemaakt. Dit maakt meer flexibiliteit, testbaarheid en onderhoudbaarheid van de code mogelijk.

Basisprincipes:

  • Inversie van controle (IoC): De component beheert niet de creatie van zijn afhankelijkheden.
  • Scheiding van verantwoordelijkheden: Het creëren van afhankelijkheden is gescheiden van het gebruik ervan.

Voordelen van DI:

  • Verbeterde testbaarheid: Het is gemakkelijk om echte afhankelijkheden te vervangen door mocks tijdens tests.
  • Vermindering van koppeling: Componenten worden minder afhankelijk van elkaar.
  • Grotere flexibiliteit en hergebruik: Het is gemakkelijk om de implementatie van een afhankelijkheid te wijzigen zonder de code van de component aan te passen.
  • Eenvoudiger beheer van afhankelijkheden: Vooral in grote projecten.

Manieren om DI te implementeren in Android:

  1. Handmatig (Manual DI): Afhankelijkheden worden doorgegeven via de constructor of via setters.
  2. Gebruik van frameworks: Dagger 2, Hilt, Koin. Deze frameworks automatiseren het proces van het creëren en leveren van afhankelijkheden.

Voorbeeld handmatig:

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

// Implementatie van afhankelijkheid
class FirebaseAnalyticsManager : AnalyticsManager {
    override fun trackEvent(eventName: String) {
        // Trackinglogica in Firebase
    }
}

// Component die afhankelijkheid nodig heeft
class UserRepository(private val analyticsManager: AnalyticsManager) { // Afhankelijkheid wordt via de constructor doorgegeven
    fun getUser(userId: String): User? {
        analyticsManager.trackEvent("UserFetched")
        // Logica om gebruiker op te halen
        return null
    }
}

// Plaats waar objecten worden gemaakt en verbonden
fun main() {
    val analytics: AnalyticsManager = FirebaseAnalyticsManager()
    val userRepository = UserRepository(analytics) // Dependency injection
}