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! ?