问题描述
我正在设计一个需要在不同部署中支持不同功能集的应用程序。我想以一种将不同功能实现打包到不同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
}
这可行,但是我不禁想到必须有一种更优雅的方法,因为我当然不是唯一需要模块自动发现的人。希望提出建议!