インターフェースを実装したクラスがあり、それをインターフェース経由でバインドしたいとき、通常以下のようにしてました。
@Module
object BookPresenterModule {
@Provides @JvmStatic
fun provideBookPresenter(bookPresenter: BookPresenterImpl): BookPresenter = bookPresenter
}
これは @Inject 付きコンストラクタと一緒に使われるモジュールの一部です。これは、以下のように記述するべきです。
@Module
abstract class BookPresenterModule {
@Binds abstract fun bindBookPresenter(bookPresenter: BookPresenterImpl): BookPresenter
}
これまでどおり「インターフェースにその実装をバインドしたいとき」に使うことができます。
コード生成がされず、どこからもコールされないのに、きちんと連携情報として利用されるのが良いところです。
Dagger 2.4 で登場したにもかかわらず、なぜか公式ユーザーガイドでは説明されていません。
👉 Release Dagger 2.4 · google/dagger
以下、公演動画などから学ぶことができます。