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>()) }
}
インターフェースを実装したくない場合は、 KoinComponent.inject()
がどのように実装されているかを確認し、同様のことを自分で行います。
val sampleClass by lazy { GlobalContext.get().koin.get<SampleClass>() }