Skip to content

Commit cd19d18

Browse files
committed
Improve Koin registration
1 parent 6990903 commit cd19d18

File tree

2 files changed

+26
-32
lines changed

2 files changed

+26
-32
lines changed

project/kediatr-koin-starter/src/main/kotlin/com/trendyol/kediatr/koin/KediatRKoinProvider.kt

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,33 @@
22

33
package com.trendyol.kediatr.koin
44

5-
import com.trendyol.kediatr.MediatorBuilder
65
import com.trendyol.kediatr.DependencyProvider
6+
import com.trendyol.kediatr.MediatorBuilder
7+
import org.koin.core.Koin
78
import org.koin.core.annotation.KoinInternalApi
8-
import org.koin.core.component.getScopeName
99
import org.koin.java.KoinJavaComponent.getKoin
10-
import org.reflections.Reflections
1110
import kotlin.reflect.KClass
1211

1312
@OptIn(KoinInternalApi::class)
1413
class KediatRKoinProvider : DependencyProvider {
15-
private val koin = getKoin()
16-
private var reflections: Reflections
17-
18-
init {
19-
val aPackage = koin.instanceRegistry.instances.entries.map {
20-
it.value.beanDefinition.definition.getScopeName().type.java.`package`
21-
}.first().name
22-
val mainPackageName = Package.getPackages().filter { aPackage.startsWith(it.name) }.map { it.name }
23-
reflections = Reflections(mainPackageName)
24-
}
25-
26-
override fun <T> getSingleInstanceOf(clazz: Class<T>): T {
27-
return koin.get(clazz.kClass())
28-
}
29-
30-
override fun <T> getSubTypesOf(clazz: Class<T>): Collection<Class<T>> {
31-
return reflections.getSubTypesOf(clazz).map { it as Class<T> }
32-
}
33-
34-
private fun <T> Class<T>.kClass(): KClass<out Any> {
35-
return (this as Class<*>).kotlin
36-
}
14+
private val koin: Koin = getKoin()
15+
private val subTypes: List<KClass<*>>
16+
get() = koin
17+
.instanceRegistry.instances
18+
.map { it.value.beanDefinition }
19+
.fold(mutableListOf<KClass<*>>()) { acc, beanDefinition ->
20+
acc.add(beanDefinition.primaryType)
21+
acc.addAll(beanDefinition.secondaryTypes)
22+
acc
23+
}.distinct()
24+
25+
override fun <T> getSingleInstanceOf(clazz: Class<T>): T = koin.get(clazz.kClass())
26+
27+
override fun <T> getSubTypesOf(clazz: Class<T>): Collection<Class<T>> = subTypes
28+
.filter { clazz.isAssignableFrom(it.java) }
29+
.map { it.java as Class<T> }
30+
31+
private fun <T> Class<T>.kClass(): KClass<out Any> = (this as Class<*>).kotlin
3732
}
3833

3934
class KediatRKoin {

project/kediatr-koin-starter/src/test/kotlin/com/trendyol/kediatr/koin/CommandHandlerTests.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.trendyol.kediatr.koin
22

3-
import com.trendyol.kediatr.CommandHandler
43
import com.trendyol.kediatr.Command
5-
import com.trendyol.kediatr.Mediator
4+
import com.trendyol.kediatr.CommandHandler
65
import com.trendyol.kediatr.HandlerNotFoundException
6+
import com.trendyol.kediatr.Mediator
77
import kotlinx.coroutines.delay
88
import kotlinx.coroutines.runBlocking
99
import org.junit.jupiter.api.Test
1010
import org.junit.jupiter.api.extension.RegisterExtension
11-
import org.koin.dsl.bind
1211
import org.koin.dsl.module
1312
import org.koin.test.KoinTest
1413
import org.koin.test.inject
@@ -25,14 +24,14 @@ class CommandHandlerTests : KoinTest {
2524
modules(
2625
module {
2726
single { KediatRKoin.getMediator() }
28-
single { ExceptionPipelineBehavior() } bind ExceptionPipelineBehavior::class
29-
single { LoggingPipelineBehavior() } bind LoggingPipelineBehavior::class
30-
single { MyCommandHandler(get()) } bind CommandHandler::class
27+
single { ExceptionPipelineBehavior() }
28+
single { LoggingPipelineBehavior() }
29+
single { MyCommandHandler(get()) }
3130
}
3231
)
3332
}
3433

35-
private val mediator by inject<Mediator>()
34+
private val mediator: Mediator by inject()
3635

3736
init {
3837
springTestCounter = 0

0 commit comments

Comments
 (0)