メインコンテンツまでスキップ

注釈付きの定義 (Definitions with Annotations)

Koin Annotationsを使用すると、通常のKoin DSLと同じ種類の定義をアノテーションで宣言できます。必要なアノテーションでクラスをタグ付けするだけで、すべてが自動的に生成されます。

たとえば、single { MyComponent(get()) } DSL宣言と同等のものは、次のように@Singleでタグ付けするだけで実現できます。

@Single
class MyComponent(val myDependency : MyDependency)

Koin Annotationsは、Koin DSLと同じセマンティクスを維持します。次の定義でコンポーネントを宣言できます。

  • @Single - シングルトンインスタンス(DSLではsingle { }で宣言)
  • @Factory - ファクトリインスタンス。インスタンスが必要になるたびに再作成されます(DSLではfactory { }で宣言)
  • @KoinViewModel - Android ViewModelインスタンス(DSLではviewModel { }で宣言)
  • @KoinWorker - Android Worker Workmanagerインスタンス(DSLではworker { }で宣言)

スコープについては、スコープの宣言セクションを確認してください。

Kotlin Multiplatform 用の Compose ViewModel を生成 (1.4.0 以降)

@KoinViewModel アノテーションを使用して、Android または Compsoe KMP ViewModel を生成できます。通常の org.koin.androidx.viewmodel.dsl.viewModel の代わりに、org.koin.compose.viewmodel.dsl.viewModelviewModel Koin 定義を生成するには、KOIN_USE_COMPOSE_VIEWMODEL オプションを有効にする必要があります。

ksp {
arg("KOIN_USE_COMPOSE_VIEWMODEL","true")
}
注記
`USE_COMPOSE_VIEWMODEL` キーは非推奨となり、`KOIN_USE_COMPOSE_VIEWMODEL` が推奨されます。
注記
Koin 4.0 では、ViewModel の型引数が同じライブラリから提供されるため、これら 2 つの ViewModel DSL が 1 つにマージされる予定です。

自動または特定のバインディング

コンポーネントを宣言するときに、検出されたすべての「バインディング」(関連するスーパークラス)がすでに準備されています。たとえば、次の定義を見てください。

@Single
class MyComponent(val myDependency : MyDependency) : MyInterface

Koinは、MyComponentコンポーネントがMyInterfaceにも関連付けられていることを宣言します。 DSLの同等物はsingle { MyComponent(get()) } bind MyInterface::classです。

Koinに自動検出させる代わりに、bindsアノテーションパラメータを使用して、実際にバインドするタイプを指定することもできます。

@Single(binds = [MyBoundType::class])

Null許容の依存関係 (Nullable Dependencies)

コンポーネントがnull許容の依存関係を使用している場合でも、心配する必要はありません。自動的に処理されます。定義アノテーションを引き続き使用すると、Koinが何をすべきかを推測します。

@Single
class MyComponent(val myDependency : MyDependency?)

生成されるDSLの同等物はsingle { MyComponent(getOrNull()) }です。

これは、注入されたパラメータとプロパティにも適用されることに注意してください。

@Named による限定子 (Qualifier)

定義に「名前」(別名限定子 (qualifier))を追加して、同じタイプの複数の定義を区別するために、@Namedアノテーションを使用します。

@Single
@Named("InMemoryLogger")
class LoggerInMemoryDataSource : LoggerDataSource

@Single
@Named("DatabaseLogger")
class LoggerLocalDataSource(private val logDao: LogDao) : LoggerDataSource

依存関係を解決するときは、named関数で限定子 (qualifier)を使用します。

val logger: LoggerDataSource by inject(named("InMemoryLogger"))

カスタム限定子 (qualifier)アノテーションを作成することも可能です。前の例を使用すると、次のようになります。

@Named
annotation class InMemoryLogger

@Named
annotation class DatabaseLogger

@Single
@InMemoryLogger
class LoggerInMemoryDataSource : LoggerDataSource

@Single
@DatabaseLogger
class LoggerLocalDataSource(private val logDao: LogDao) : LoggerDataSource
val logger: LoggerDataSource by inject(named<InMemoryLogger>())

@InjectedParam を使用した注入されたパラメータ

コンストラクタメンバーを「注入されたパラメータ」としてタグ付けできます。これは、解決を呼び出すときに依存関係がグラフに渡されることを意味します。

例:

@Single
class MyComponent(@InjectedParam val myDependency : MyDependency)

次に、MyComponentを呼び出して、MyDependencyのインスタンスを渡すことができます。

val m = MyDependency
// MyDependencyを渡しながらMyComponentを解決する
koin.get<MyComponent> { parametersOf(m) }

生成されるDSLの同等物はsingle { params -> MyComponent(params.get()) }です。

遅延依存関係の注入 - Lazy<T>

Koinは、遅延依存関係を自動的に検出し、解決できます。たとえば、ここではLoggerDataSource定義を遅延的に解決します。 Lazy Kotlinタイプを次のように使用するだけです。

@Single
class LoggerInMemoryDataSource : LoggerDataSource

@Single
class LoggerAggregator(val lazyLogger : Lazy<LoggerDataSource>)

背後では、get()ではなくinject()のようなDSLが生成されます。

single { LoggerAggregator(inject()) }

依存関係のリストの注入 - List<T>

Koinは、依存関係のリストをすべて自動的に検出し、解決できます。たとえば、ここではすべてのLoggerDataSource定義を解決します。 List Kotlinタイプを次のように使用するだけです。

@Single
@Named("InMemoryLogger")
class LoggerInMemoryDataSource : LoggerDataSource

@Single
@Named("DatabaseLogger")
class LoggerLocalDataSource(private val logDao: LogDao) : LoggerDataSource

@Single
class LoggerAggregator(val datasource : List<LoggerDataSource>)

背後では、getAll()関数のようなDSLが生成されます。

single { LoggerAggregator(getAll()) }

@Property を使用したプロパティ

定義でKoinプロパティを解決するには、コンストラクタメンバーに@Propertyのタグを付けます。 これにより、アノテーションに渡される値のおかげでKoinプロパティが解決されます。

@Factory
public class ComponentWithProps(
@Property("id") public val id : String
)

生成されるDSLの同等物はfactory { ComponentWithProps(getProperty("id")) }です。

@PropertyValue - デフォルト値を持つプロパティ (1.4以降)

Koin Annotationsは、@PropertyValueアノテーションを使用して、コードから直接プロパティのデフォルト値を定義する可能性を提供します。 サンプルに従いましょう。

@Factory
public class ComponentWithProps(
@Property("id") public val id : String
){
public companion object {
@PropertyValue("id")
public const val DEFAULT_ID : String = "_empty_id"
}
}

生成されるDSLの同等物はfactory { ComponentWithProps(getProperty("id", ComponentWithProps.DEFAAULT_ID)) }です。