在类路径中发现koin模块

问题描述

我正在设计一个需要在不同部署中支持不同功能集的应用程序。我想以一种将不同功能实现打包到不同jar中的方式构建它。根据类路径中的实际jar,微内核会自动发现并激活各个功能

我希望使用Koin作为自动发现功能的微内核框架。我喜欢事实,它非常轻巧,是Kotlin原生的,并且为配置和依赖管理提供了强大的支持

但是,Koin中似乎不支持通过类路径自动发现模块,我想知道我是否丢失了某些东西,并且有办法自动拾取模块吗?

我将发布自己的“实用”解决方案,该解决方案似乎并不是Kotlin风格的,因此欢迎提出建议,以寻求更好的方法

解决方法

我使用的设计是Java的经典作品,它依赖于java.util.ServiceLoader。每个jar将在/META-INF/services中有一个文件,该文件将包含为该jar实现ModuleProvider接口的类的名称。接口定义如下:

interface ModuleProvider {
  fun buildModule(): org.koin.core.module.Module
}

我的微内核引导例程现在如下所示:

fun main() {
  val app = startKoin {
    environmentProperties() // allow system properties to be injected
    modules(ServiceLoader.load(ModuleProvider::class.java).iterator().asSequence().map { it.buildModule() }.toList())
  }
  // rest of bootstrap
}

这可行,但是我不禁想到必须有一种更优雅的方法,因为我当然不是唯一需要模块自动发现的人。希望提出建议!