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
}
最近我用 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
}