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

Koin Annotations におけるスコープ (Scopes)

定義とモジュールを使用する際に、特定の空間と時間分解能に対してスコープを定義する必要がある場合があります。

@Scope でスコープを定義する

Koin ではスコープを使用できます。基本については、Koin スコープのセクションを参照してください。

アノテーションを使用してスコープを宣言するには、次のようにクラスに @Scope アノテーションを使用します。

@Scope
class MyScopeClass

これは、次のスコープセクションと同等です。

scope<MyScopeClass> {

}

または、型よりもスコープ名が必要な場合は、name パラメータを使用して、@Scope(name = ) アノテーションでクラスをタグ付けする必要があります。

@Scope(name = "my_scope_name")
class MyScopeClass

これは次と同等です。

scope<named("my_scope_name")> {

}

@Scoped でスコープに定義を追加する

スコープ(アノテーションで定義されているかどうかにかかわらず)内に定義を宣言するには、@Scope および @Scoped アノテーションでクラスをタグ付けします。

@Scope(name = "my_scope_name")
@Scoped
class MyScopedComponent

これにより、スコープセクション内に適切な定義が生成されます。

scope<named("my_scope_name")> {
scoped { MyScopedComponent() }
}
備考

必要なスコープ空間(@Scope を使用)と定義するコンポーネントの種類(@Scoped を使用)を示すために、両方のアノテーションが必要です。

スコープからの依存関係解決

スコープされた定義から、内部スコープおよび親スコープから任意の定義を解決できます。

たとえば、次のケースは機能します。

@Single
class MySingle

@Scope(name = "my_scope_name")
@Scoped
class MyScopedComponent(
val mySingle : MySingle,
val myOtherScopedComponent :MyOtherScopedComponent
)

@Scope(name = "my_scope_name")
@Scoped
class MyOtherScopedComponent(
val mySingle : MySingle
)

コンポーネント MySingle は、ルートで single 定義として定義されています。MyScopedComponentMyOtherScopedComponent は、スコープ "my_scope_name" で定義されています。 MyScopedComponent からの依存関係解決は、MySingle インスタンスを使用して Koin ルートにアクセスし、現在の "my_scope_name" スコープから MyOtherScopedComponent スコープされたインスタンスにアクセスします。

@ScopeId でスコープ外を解決する (1.3.0 以降)

スコープに直接アクセスできない別のスコープからコンポーネントを解決する必要がある場合があります。これを行うには、@ScopeId アノテーションで依存関係をタグ付けして、Koin に特定のスコープ ID のスコープでこの依存関係を見つけるように指示する必要があります。

@Factory
class MyFactory(
@ScopeId("my_scope_id") val myScopedComponent :MyScopedComponent
)

上記のコードは、生成されたものと同等です。

factory { Myfactory(getScope("my_scope_id").get()) }

この例は、MyFactory コンポーネントが、ID "my_scope_id" を持つスコープインスタンスから MyScopedComponent コンポーネントを解決することを示しています。ID "my_scope_id" で作成されたこのスコープは、適切なスコープ定義で作成する必要があります。

備考

MyScopedComponent コンポーネントは Scope (スコープ) セクションで定義する必要があり、スコープインスタンスは ID "my_scope_id" で作成する必要があります。