依存関係の登録
必要な依存関係: io.ktor:ktor-server-di
コード例: server-di
Ktorの依存性の注入 (DI)コンテナは、アプリケーションが依存するオブジェクトを作成する方法を知る必要があります。このプロセスは「依存関係の登録」と呼ばれます。
基本的な依存関係の登録
基本的な依存関係の登録は、通常、Applicationモジュール内のdependencies {}ブロックを使用してコード内で行われます。
依存関係は、ラムダ、関数参照、クラス参照、またはコンストラクタ参照を提供することで登録できます。
ラムダを使用する
インスタンスの作成方法を完全に制御したい場合は、ラムダを使用します。
dependencies {
provide<GreetingService> { GreetingServiceImpl() }
}これは GreetingService のプロバイダーを登録します。GreetingService が要求されるたびに、ラムダが実行されてインスタンスが作成されます。
コンストラクタ参照を使用する
クラスがコンストラクタを使用して作成でき、かつすべてのコンストラクタパラメータがすでにDIコンテナに登録されている場合は、コンストラクタ参照を使用できます。
dependencies {
provide<GreetingService>(::GreetingServiceImpl)
}これは、アプリケーションに GreetingServiceImpl のコンストラクタを使用するように指示し、パラメータの解決はDIに任せます。
クラス参照を使用する
インターフェースにバインドせずに、具象クラスを登録できます。
dependencies {
provide(BankServiceImpl::class)
}この場合、依存関係は BankServiceImpl 型によって解決されます。 これは、実装型が直接注入され、抽象化が必要ない場合に便利です。
関数参照を使用する
インスタンスを作成して返す関数を登録できます。
dependencies {
provide(::createBankTeller)
}DIコンテナは関数のパラメータを解決し、戻り値を依存関係のインスタンスとして使用します。
ファクトリラムダを使用する
関数自体を依存関係として登録できます。
dependencies {
provide<() -> GreetingService> {
{ GreetingServiceImpl() }
}
}これにより、手動で呼び出して新しいインスタンスを作成できる、注入可能な関数が登録されます。
名前付き依存関係の登録
登録時に依存関係に名前を割り当てることで、同じ型の複数のプロバイダーを区別できます。
これは、単一の型に対して複数の実装またはインスタンスを登録し、解決時にそれらを明示的に選択する必要がある場合に便利です。
依存関係に名前を割り当てるには、provide() 関数の最初の引数として名前を渡します。
dependencies {
provide("default") { GreetingServiceImpl() }
provide("alternative") { AlternativeGreetingServiceImpl() }
}名前付き依存関係は、@Namedアノテーションを使用して明示的に解決する必要があります。
設定ベースの依存関係の登録
設定ファイル内のクラスパス参照を使用して、宣言的に依存関係を設定できます。オブジェクトを返す関数、または解決可能なコンストラクタを持つクラスをリストできます。
設定ファイルの ktor.application.dependencies グループの下に依存関係をリストします。
ktor:
application:
dependencies:
- com.example.RepositoriesKt.provideDatabase
- com.example.UserRepositoryKtorはDIコンテナを使用して、関数やコンストラクタのパラメータを自動的に解決します。
