startKoin 崩溃,图书馆

startKoin crash, library

最近我用 koin 发布了一个库;当我在我自己的应用程序中使用这个库时,一切正常,因为我没有在我的应用程序中使用 Koin,但是如果我在我的应用程序和库中都使用 startKoin,应用程序就会崩溃!

有什么方法可以在应用程序和库中一样使用 koin 吗?如何在我的库中调用 startKoin 而不会在使用 koin 并调用 startKoin 的应用程序中遇到任何问题?

org.koin.core.error.KoinAppAlreadyStartedException: A Koin Application has already been started

我认为库中不应包含任何依赖项注入框架,除非该库仅供您自己的项目使用。选择依赖注入框架是一个应用程序范围的架构决策,库不应该强迫库的用户做出任何特定的选择。

我的建议是从您的库中完全删除 koin。

崩溃只是设计问题的一个征兆:库在应用程序范围内做出决定。从库中删除 koin 也可以避免崩溃。

从概念上讲,您可以在您的库中使用依赖注入。例如,将依赖项作为构造函数参数,并允许调用者使用他们选择的任何 DI 框架(或根本 none)来连接依赖项。

经过一些研究,我发现我应该使用自定义 KoinComponent

基于文档:

For SDK Makers, you can also work with Koin in a non global way: use Koin for the DI of your library and avoid any conflict by people using your library and Koin by isolating your context

// create a KoinApplication
val myApp = koinApplication {
// declare used modules
modules(coffeeAppModule)
}

并将myApp保存在一个对象中:

// Get a Context for your Koin instance
object MyKoinContext {
var koinApp : KoinApplication? = null
}

// Register the Koin context
MyKoinContext.koinApp = KoinApp 

然后:

interface CustomKoinComponent : KoinComponent {
// Override default Koin instance, intially target on GlobalContext to yours
override fun getKoin(): Koin = MyKoinContext?.koinApp.koin

}

现在,您注册您的上下文和 运行 您自己的独立 Koin 组件:

MyKoinContext.koinApp = myApp

class ACustomKoinComponent : CustomKoinComponent(){
// inject & get will target MyKoinContext
}

more info