Skip to main content

Context Isolation

What Context Isolation?

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.

In a standard way, we can start Koin like that:

// start a KoinApplication and register it in Global context
startKoin {

// declare used modules
modules(...)
}

This uses the default Koin context to register your dependencies.

But if we want to use an isolated Koin instance, you need declare an instance and store it in a class to hold your instance. You will have to keep your Koin Application instance available in your library and pass it to your custom KoinComponent implementation:

The MyIsolatedKoinContext class is holding our Koin instance here:

// Get a Context for your Koin instance
object MyIsolatedKoinContext {

private val koinApp = koinApplication {
// declare used modules
modules(coffeeAppModule)
}

val koin = koinApp.koin
}

Let's use MyIsolatedKoinContext to define our IsolatedKoinComponent class, a KoinComponent that will use our isolated context:

internal interface IsolatedKoinComponent : KoinComponent {

// Override default Koin instance
override fun getKoin(): Koin = MyIsolatedKoinContext.koin
}

Everything is ready, just use IsolatedKoinComponent to retrieve instances from isolated context:

class MyKoinComponent : IsolatedKoinComponent {
// inject & get will target MyKoinContext
}

Testing

To test classes that are retrieving dependencies with by inject() delegate override getKoin() method and define custom Koin module:

class MyClassTest : KoinTest {
// Koin Context used to retrieve dependencies
override fun getKoin(): Koin = MyIsolatedKoinContext.koin

@Before
fun setUp() {
// Define custom Koin module
val module = module {
// Register dependencies
}

koin.loadModules(listOf(module))
}
}