|
2 | 2 |
|
3 | 3 | package com.trendyol.kediatr.koin |
4 | 4 |
|
5 | | -import com.trendyol.kediatr.MediatorBuilder |
6 | 5 | import com.trendyol.kediatr.DependencyProvider |
| 6 | +import com.trendyol.kediatr.MediatorBuilder |
| 7 | +import org.koin.core.Koin |
7 | 8 | import org.koin.core.annotation.KoinInternalApi |
8 | | -import org.koin.core.component.getScopeName |
9 | 9 | import org.koin.java.KoinJavaComponent.getKoin |
10 | | -import org.reflections.Reflections |
11 | 10 | import kotlin.reflect.KClass |
12 | 11 |
|
13 | 12 | @OptIn(KoinInternalApi::class) |
14 | 13 | 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 |
37 | 32 | } |
38 | 33 |
|
39 | 34 | class KediatRKoin { |
|
0 commit comments