L?sningsforslag: Dependency Injection i Kotlin for Android

Her finner du l?sningsforslag til oppgavene fra "Dependency Injection i Kotlin for Android".

Oppgave 1: Manuell Dependency Injection

L?sning: Legge til en parameter for motortype i Engine-klassen.

class Engine(private val type: String) {
    fun start() = "$type engine started"
}

class Car(private val engine: Engine) {
    fun drive() = "Driving with ${engine.start()}"
}

fun main() {
    val petrolEngine = Engine("Petrol")
    val car = Car(petrolEngine)
    println(car.drive())
}

Oppgave 2: Bruk av Interfaces for Dependency Injection

L?sning: Legge til ElectricEngine-klassen.

interface Engine {
    fun start(): String
}

class PetrolEngine : Engine {
    override fun start() = "Petrol engine started"
}

class DieselEngine : Engine {
    override fun start() = "Diesel engine started"
}

class ElectricEngine : Engine {
    override fun start() = "Electric engine started"
}

class Car(private val engine: Engine) {
    fun drive() = "Driving with ${engine.start()}"
}

fun main() {
    val electricCar = Car(ElectricEngine())
    println(electricCar.drive())
}

Oppgave 3: Bruk av Fabrikkm?nster for Dependency Injection

L?sning: Legge til st?tte for ElectricEngine i EngineFactory.

class EngineFactory {
    fun createEngine(type: String): Engine {
        return when (type) {
            "petrol" -> PetrolEngine()
            "diesel" -> DieselEngine()
            "electric" -> ElectricEngine()
            else -> throw IllegalArgumentException("Unknown engine type")
        }
    }
}

fun main() {
    val engineFactory = EngineFactory()
    val electricEngine = engineFactory.createEngine("electric")
    println(electricEngine.start())
}

Oppgave 4: Grunnleggende Dependency Injection med Hilt

L?sning: Bruke Hilt for ? injisere Car i MainActivity.

@HiltAndroidApp
class MyApplication : Application()

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var car: Car

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        println(car.drive())
    }
}

class Engine @Inject constructor() {
    fun start() = "Engine started with Hilt"
}

class Car @Inject constructor(private val engine: Engine) {
    fun drive() = "Driving with ${engine.start()}"
}

Oppgave 5: Interface Injection med Hilt

L?sning: Bruke Hilt-moduler for ? injisere en PetrolEngine.

interface Engine {
    fun start(): String
}

class PetrolEngine @Inject constructor() : Engine {
    override fun start() = "Petrol engine started"
}

class DieselEngine @Inject constructor() : Engine {
    override fun start() = "Diesel engine started"
}

class Car @Inject constructor(private val engine: Engine) {
    fun drive() = "Driving with ${engine.start()}"
}

@Module
@InstallIn(SingletonComponent::class)
object EngineModule {
    @Provides
    fun provideEngine(): Engine = PetrolEngine()
}

Oppgave 6: Bruk av Hilt-moduler

L?sning: Legge til ElectricEngine i AppModule.

class ElectricEngine @Inject constructor() : Engine {
    override fun start() = "Electric engine started"
}

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun provideEngine(): Engine = ElectricEngine()
    
    @Provides
    fun provideCar(engine: Engine): Car = Car(engine)
}

Dette er l?sningsforslag til oppgavene. Du kan eksperimentere videre ved ? pr?ve forskjellige typer motorer og variasjoner i modulene! ?