Skip to content

Commit

Permalink
add optional boolean "createEagerinstances" to loadKoinModules functi…
Browse files Browse the repository at this point in the history
…on, to let decide to create eager instances or not
  • Loading branch information
arnaudgiuliani committed Sep 4, 2023
1 parent 02d4373 commit 4477082
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 19 deletions.
9 changes: 8 additions & 1 deletion core/koin-core/src/commonMain/kotlin/org/koin/core/Koin.kt
Expand Up @@ -302,11 +302,18 @@ class Koin {

/**
* Load module & create eager instances
*
* @param allowOverride - allow to override definitions
* @param createEagerInstances - run instance creation for eager single definitions
*/
fun loadModules(modules: List<Module>, allowOverride: Boolean = true) {
fun loadModules(modules: List<Module>, allowOverride: Boolean = true, createEagerInstances : Boolean = false) {
val flattedModules = flatten(modules)
instanceRegistry.loadModules(flattedModules, allowOverride)
scopeRegistry.loadScopes(flattedModules)

if (createEagerInstances){
createEagerInstances()
}
}

fun unloadModules(modules: List<Module>) {
Expand Down
Expand Up @@ -84,7 +84,7 @@ class KoinApplication private constructor() {
}

private fun loadModules(modules: List<Module>) {
koin.loadModules(modules, allowOverride = allowOverride)
koin.loadModules(modules, allowOverride = allowOverride, createEagerInstances = false)
}

/**
Expand Down
Expand Up @@ -55,12 +55,12 @@ interface KoinContext {
/**
* load Koin module in global Koin context
*/
fun loadKoinModules(module: Module)
fun loadKoinModules(module: Module, createEagerInstances: Boolean = false)

/**
* load Koin modules in global Koin context
*/
fun loadKoinModules(modules: List<Module>)
fun loadKoinModules(modules: List<Module>, createEagerInstances: Boolean = false)

/**
* unload Koin module from global Koin context
Expand Down
Expand Up @@ -187,7 +187,7 @@ class DynamicModulesTest : KoinCoreTest() {
assertEquals(42, app.koin.get<Simple.MySingle> { parametersOf(42) }.id)

koin.unloadModules(listOf(module))
koin.loadModules(listOf(module))
koin.loadModules(listOf(module), createEagerInstances = false)

assertNotNull(app.getBeanDefinition(Simple.MySingle::class))

Expand All @@ -209,7 +209,7 @@ class DynamicModulesTest : KoinCoreTest() {

val koin = app.koin

koin.loadModules(listOf(module))
koin.loadModules(listOf(module), createEagerInstances = false)
koin.createEagerInstances()

assertTrue(created)
Expand All @@ -230,12 +230,32 @@ class DynamicModulesTest : KoinCoreTest() {

val koin = app.koin

koin.loadModules(listOf(module))
koin.loadModules(listOf(module), createEagerInstances = false)
koin.createEagerInstances()

assertTrue(created)
}

@Test
fun `create at start for external modules - create eager`() {
var created = false
val module = module(createdAtStart = true) {
single {
created = true
Simple.MySingle(42)
}
}
val app = koinApplication {
printLogger(Level.DEBUG)
}

val koin = app.koin

koin.loadModules(listOf(module), createEagerInstances = true)

assertTrue(created)
}

@Test
fun `should reload module definition - global context`() {
val module = module {
Expand Down
Expand Up @@ -60,12 +60,12 @@ object GlobalContext : KoinContext {
return koinApplication
}

override fun loadKoinModules(module: Module) {
get().loadModules(listOf(module))
override fun loadKoinModules(module: Module,createEagerInstances : Boolean) {
get().loadModules(listOf(module), createEagerInstances = createEagerInstances)
}

override fun loadKoinModules(modules: List<Module>) {
get().loadModules(modules)
override fun loadKoinModules(modules: List<Module>, createEagerInstances : Boolean) {
get().loadModules(modules, createEagerInstances = createEagerInstances)
}

override fun unloadKoinModules(module: Module) {
Expand Down
Expand Up @@ -66,12 +66,12 @@ object GlobalContext : KoinContext {
return koinApplication
}

override fun loadKoinModules(module: Module) = synchronized(this) {
get().loadModules(listOf(module))
override fun loadKoinModules(module: Module, createEagerInstances : Boolean) = synchronized(this) {
get().loadModules(listOf(module), createEagerInstances = createEagerInstances)
}

override fun loadKoinModules(modules: List<Module>) = synchronized(this) {
get().loadModules(modules)
override fun loadKoinModules(modules: List<Module>, createEagerInstances : Boolean) = synchronized(this) {
get().loadModules(modules, createEagerInstances = createEagerInstances)
}

override fun unloadKoinModules(module: Module) = synchronized(this) {
Expand Down
Expand Up @@ -66,12 +66,12 @@ internal class MutableGlobalContext : KoinContext {
koinApplication
}

override fun loadKoinModules(module: Module) = lock.withLock {
get().loadModules(listOf(module))
override fun loadKoinModules(module: Module, createEagerInstances : Boolean) = lock.withLock {
get().loadModules(listOf(module), createEagerInstances = createEagerInstances)
}

override fun loadKoinModules(modules: List<Module>) = lock.withLock {
get().loadModules(modules)
override fun loadKoinModules(modules: List<Module>, createEagerInstances : Boolean) = lock.withLock {
get().loadModules(modules, createEagerInstances = createEagerInstances)
}

override fun unloadKoinModules(module: Module) = lock.withLock {
Expand Down

0 comments on commit 4477082

Please sign in to comment.