Skip to content

コンテキストの分離

コンテキストの分離(Context isolation)を使用すると、SDK開発者はホストアプリケーションのKoinインスタンスと競合することなくKoinを使用できるようになります。

INFO

標準的なKoinのセットアップについては、Koinの開始を参照してください。

いつコンテキストの分離を使用するか

  • SDK/ライブラリ開発 - ライブラリ内部でKoinを使用する場合
  • 競合の回避 - ホストアプリもKoinを使用している可能性がある場合
  • カプセル化 - DIコンテナをプライベートに保つ場合

分離されたコンテキストの作成

GlobalContext に登録を行う startKoin を使用する代わりに、 koinApplication を使用します:

kotlin
// SDK用の分離されたKoinコンテキスト
object MySdkKoinContext {

    private val koinApp = koinApplication {
        modules(sdkModule)
    }

    val koin = koinApp.koin
}

val sdkModule = module {
    single<SdkService>()
    single<SdkRepository>()
}

カスタムKoinComponent

分離されたコンテキストを使用するカスタムの KoinComponent を作成します:

kotlin
internal interface SdkKoinComponent : KoinComponent {
    // 分離されたコンテキストを使用するようにオーバーライドする
    override fun getKoin(): Koin = MySdkKoinContext.koin
}

// SDKクラスでの使用例
class MySdkClass : SdkKoinComponent {
    private val service: SdkService by inject()  // 分離されたコンテキストを使用する
}

分離されたコンテキストのテスト

テストで分離されたコンテキストを使用するには、 getKoin() をオーバーライドします:

kotlin
class SdkTest : KoinTest {
    override fun getKoin(): Koin = MySdkKoinContext.koin

    @Before
    fun setUp() {
        val testModule = module {
            single<SdkService> { MockSdkService() }
        }
        koin.loadModules(listOf(testModule))
    }

    @After
    fun tearDown() {
        koin.unloadModules(listOf(testModule))
    }
}

関連項目