Koin Core is a pragmatic lightweight dependency injection framework for Kotlin Multiplatform with iOS Simulator ARM64 target support.
npx @tessl/cli install tessl/maven-io-insert-koin--koin-core-iossimulatorarm64@4.1.0Koin Core is a pragmatic lightweight dependency injection framework for Kotlin Multiplatform applications with iOS Simulator ARM64 target support. It provides a simple DSL to declare your application components and manages their lifecycle automatically.
Koin Core offers several key capabilities for dependency injection:
import org.koin.core.Koin
import org.koin.core.KoinApplication
import org.koin.dsl.*
// Define a module
val appModule = module {
single<Repository> { DatabaseRepository() }
factory<UseCase> { GetDataUseCase(get()) }
}
// Start Koin
val koinApp = koinApplication {
modules(appModule)
}
// Get dependencies
val repository: Repository = koinApp.koin.get()Koin applications are configured using KoinApplication which provides the main entry point and configuration options.
// Create and configure a Koin application
fun koinApplication(
createEagerInstances: Boolean = true,
appDeclaration: KoinAppDeclaration? = null
): KoinApplication
fun koinApplication(appDeclaration: KoinAppDeclaration?): KoinApplication
fun koinApplication(configuration: KoinConfiguration?): KoinApplication
fun koinApplication(createEagerInstances: Boolean): KoinApplication
// Type aliases
typealias KoinAppDeclaration = KoinApplication.() -> Unitclass KoinApplication {
val koin: Koin
// Module management
fun modules(modules: Module): KoinApplication
fun modules(vararg modules: Module): KoinApplication
fun modules(modules: List<Module>): KoinApplication
// Configuration
fun allowOverride(override: Boolean): Unit
fun properties(values: Map<String, Any>): KoinApplication
fun logger(logger: Logger): KoinApplication
fun printLogger(level: Level = Level.INFO): KoinApplication
fun options(vararg optionValue: Pair<KoinOption, Any>): KoinApplication
// Lifecycle
fun createEagerInstances(): Unit
fun close(): Unit
companion object {
fun init(): KoinApplication
}
}→ Application Setup & Configuration
The Koin class provides the main dependency resolution and injection capabilities.
class Koin {
// Direct resolution
inline fun <reified T : Any> get(
qualifier: Qualifier? = null,
noinline parameters: ParametersDefinition? = null
): T
// Lazy injection
inline fun <reified T : Any> inject(
qualifier: Qualifier? = null,
mode: LazyThreadSafetyMode = KoinPlatformTools.defaultLazyMode(),
noinline parameters: ParametersDefinition? = null
): Lazy<T>
// Nullable variants
inline fun <reified T : Any> getOrNull(/* ... */): T?
inline fun <reified T : Any> injectOrNull(/* ... */): Lazy<T?>
// Non-reified variants
fun <T> get(clazz: KClass<*>, qualifier: Qualifier?, parameters: ParametersDefinition?): T
fun <T> getOrNull(clazz: KClass<*>, qualifier: Qualifier?, parameters: ParametersDefinition?): T?
// Collections
inline fun <reified T> getAll(): List<T>
// Instance declaration
inline fun <reified T> declare(
instance: T,
qualifier: Qualifier? = null,
secondaryTypes: List<KClass<*>> = emptyList(),
allowOverride: Boolean = true
)
// Property management
fun <T : Any> getProperty(key: String, defaultValue: T): T
fun <T : Any> getProperty(key: String): T?
fun setProperty(key: String, value: Any)
fun deleteProperty(key: String)
// Scope management
fun deleteScope(scopeId: ScopeID)
fun getScopeOrNull(scopeId: ScopeID): Scope?
// Module management
fun loadModules(modules: List<Module>, allowOverride: Boolean = true, createEagerInstances: Boolean = false)
fun unloadModules(modules: List<Module>)
}Modules organize your dependencies using a simple DSL for defining singletons, factories, and scoped instances.
// Create module
fun module(createdAtStart: Boolean = false, moduleDeclaration: ModuleDeclaration): Module
typealias ModuleDeclaration = Module.() -> Unitclass Module {
val id: String
val isLoaded: Boolean
var eagerInstances: LinkedHashSet<SingleInstanceFactory<*>>
// Core definitions
inline fun <reified T> single(
qualifier: Qualifier? = null,
createdAtStart: Boolean = false,
definition: Definition<T>
): KoinDefinition<T>
inline fun <reified T> factory(
qualifier: Qualifier? = null,
definition: Definition<T>
): KoinDefinition<T>
// Scope definitions
fun scope(qualifier: Qualifier, scopeSet: ScopeDSL.() -> Unit)
inline fun <reified T> scope(scopeSet: ScopeDSL.() -> Unit)
// Module composition
fun includes(vararg module: Module)
fun includes(module: Collection<Module>)
operator fun plus(module: Module): List<Module>
}
// Type aliases
typealias Definition<T> = Scope.(ParametersHolder) -> TScopes provide lifecycle management for dependencies, allowing you to create and destroy sets of related instances.
class Scope {
val scopeQualifier: Qualifier
val id: ScopeID
val isRoot: Boolean
val closed: Boolean
// Resolution methods
inline fun <reified T : Any> inject(/* ... */): Lazy<T>
inline fun <reified T : Any> get(/* ... */): T
inline fun <reified T : Any> getAll(): List<T>
// Scope operations
fun linkTo(vararg scopes: Scope)
fun unlink(vararg scopes: Scope)
fun close()
}
typealias ScopeID = Stringclass ScopeDSL {
inline fun <reified T> scoped(
qualifier: Qualifier? = null,
definition: Definition<T>
): KoinDefinition<T>
inline fun <reified T> factory(
qualifier: Qualifier? = null,
definition: Definition<T>
): KoinDefinition<T>
}Component interfaces provide automatic dependency injection capabilities to your classes.
interface KoinComponent {
fun getKoin(): Koin
}
interface KoinScopeComponent : KoinComponent {
val scope: Scope
}
// Extension functions for KoinComponent
inline fun <reified T : Any> KoinComponent.get(/* ... */): T
inline fun <reified T : Any> KoinComponent.inject(/* ... */): Lazy<T>
// Extension functions for KoinScopeComponent
fun <T : Any> T.getScopeId(): String
fun <T : Any> T.getScopeName(): TypeQualifier
fun <T : KoinScopeComponent> T.createScope(/* ... */): ScopeQualifiers distinguish between different instances of the same type, while parameters allow passing runtime values during injection.
interface Qualifier {
val value: QualifierValue
}
typealias QualifierValue = String
// Qualifier creation functions
fun named(name: String): StringQualifier
fun <E : Enum<E>> named(enum: Enum<E>): Qualifier
fun qualifier(name: String): StringQualifier
inline fun <reified T> named(): TypeQualifier
fun _q(name: String): StringQualifier
// Qualifier implementations
class StringQualifier : Qualifier
class TypeQualifier : Qualifierclass ParametersHolder {
val values: List<Any?>
var index: Int
// Access methods
operator fun <T> get(i: Int): T
inline fun <reified T : Any> get(): T
inline operator fun <reified T> component1(): T // through component5()
// Utility methods
fun size(): Int
fun isEmpty(): Boolean
fun add(value: Any): ParametersHolder
}
// Parameter creation functions
fun parametersOf(vararg parameters: Any?): ParametersHolder
fun emptyParametersHolder(): ParametersHolder
typealias ParametersDefinition = () -> ParametersHolderKoin provides comprehensive exception handling for dependency injection failures.
// Resolution failures
class NoDefinitionFoundException : RuntimeException
class InstanceCreationException : RuntimeException
class NoParameterFoundException : RuntimeException
// Scope failures
class ClosedScopeException : RuntimeException
class ScopeNotCreatedException : RuntimeException
class ScopeAlreadyCreatedException : RuntimeException
class NoScopeDefFoundException : RuntimeException
class MissingScopeValueException : RuntimeException
// Configuration failures
class DefinitionOverrideException : RuntimeException
class DefinitionParameterException : RuntimeException
class MissingPropertyException : RuntimeException
class NoPropertyFileFoundException : RuntimeException
class KoinApplicationAlreadyStartedException : RuntimeException// Platform-specific utilities
object KoinPlatformTools {
fun defaultLazyMode(): LazyThreadSafetyMode
fun generateId(): String
}
// Thread-local storage
expect class ThreadLocal<T>
// Time utilities
class KoinPlatformTimeToolsThis comprehensive framework enables clean, testable dependency injection across your Kotlin Multiplatform applications with minimal boilerplate and maximum flexibility.