跳到主要内容

上下文隔离 (Context Isolation)

什么是上下文隔离 (Context Isolation)?

对于SDK开发者来说,你也可以用非全局的方式使用 Koin:使用 Koin 来为你的库进行依赖注入(DI),并通过隔离你的上下文来避免任何使用你的库和 Koin 的人产生的冲突。

通常情况下,我们可以这样启动 Koin:

// 启动一个 KoinApplication 并在全局上下文中注册它
startKoin {

// 声明使用的模块
modules(...)
}

这会使用默认的 Koin 上下文来注册你的依赖。

但如果我们想要使用一个隔离的 Koin 实例,你需要声明一个实例并将其存储在一个类中,以持有你的实例。 你需要在你的库中保持你的 Koin Application 实例可用,并将其传递给你的自定义 KoinComponent 实现:

MyIsolatedKoinContext 类在这里持有我们的 Koin 实例:

// 为你的 Koin 实例获取一个上下文
object MyIsolatedKoinContext {

private val koinApp = koinApplication {
// 声明使用的模块
modules(coffeeAppModule)
}

val koin = koinApp.koin
}

让我们使用 MyIsolatedKoinContext 来定义我们的 IsolatedKoinComponent 类,一个将使用我们隔离上下文的 KoinComponent:

internal interface IsolatedKoinComponent : KoinComponent {

// 覆盖默认的 Koin 实例
override fun getKoin(): Koin = MyIsolatedKoinContext.koin
}

一切都准备好了,只需使用 IsolatedKoinComponent 从隔离的上下文中检索实例:

class MyKoinComponent : IsolatedKoinComponent {
// 注入 & 获取 将会定位到 MyKoinContext
}

测试

要测试那些通过 by inject() 委托检索依赖的类,覆盖 getKoin() 方法并定义自定义 Koin 模块:

class MyClassTest : KoinTest {
// 用于检索依赖的 Koin 上下文
override fun getKoin(): Koin = MyIsolatedKoinContext.koin

@Before
fun setUp() {
// 定义自定义 Koin 模块
val module = module {
// 注册依赖
}

koin.loadModules(listOf(module))
}
}