web-dev-qa-db-ja.com

KoinはAndroidアクティビティ/ appcompatactivityの外部に注入する方法

KoinはDI用の新しい軽量ライブラリであり、Android asスタンドアロンのKotlinアプリでも同様です。

通常、次のように依存関係を注入します。

_class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
_

inject()メソッドを使用します。

しかし、Activityコンテキストが利用できない場所、つまりActivityの外にものを注入するのはどうですか?

救いの手を差し伸べるKoinComponentがあります。どのクラスでも、簡単に次のことができます。

_class SampleClass : KoinComponent {

    val a : A? by inject()
    val b : B? by inject()
}
_

KoinComponentを拡張すると、inject()メソッドにアクセスできるようになります。

通常は、通常の方法で注入するだけで十分です。

_class SampleClass(val a : A?, val b: B?)
_

Koinは、KoinComponentインターフェースを使用してこれに対するソリューションを提供します。たとえば、リポジトリでいくつかの依存関係を取得する必要がある場合は、KoinComponentインターフェースを実装するだけで済みます。 get()inject()などのさまざまなKoin機能にアクセスできます。 KoinComponentは、コンストラクターを書き換えて、依存関係をコンストラクターパラメーターとして受け入れることができない場合にのみ使用してください。

class MyRepository: Repository(), KoinComponent {
  private val myService by inject<MyService>()
}

コンストラクターインジェクションはこのアプローチよりも優れています。

たとえば、同じことは次の方法でも実現できます。

class MyRepository(private val service: MyService): Repository() {
    ...
}

そして、このクラスをインスタンス化するための定義をKoinモジュールに追加できます。

val serviceModule = module {
    ...

    factory { MyService() }
}
val repositoryModule = module {
    ...

    factory { MyRepository(get<MyService>()) }
}
11
harold_admin

インターフェースを実装したくない場合は、 KoinComponent.inject() がどのように実装されているかを確認し、同様のことを自分で行います。

val sampleClass by lazy { GlobalContext.get().koin.get<SampleClass>() }
0
Mark