〈kotlin〉依存関係インジェクション(DI) Hilt 修飾子

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。
DIを自動で行うためのライブラリHiltの実装記事の続き。
〈kotlin〉依存関係インジェクション(DI) Hilt編 - ゆるプログラミング日記


同じ型で複数の実装を提供したい場合、修飾子を使用する。
修飾子は実装の提供方法を識別するためのアノテーション

実装例

以下のサンプルコードを元にする。
Dependency injection with Hilt  |  Android Developers

インターセプタを追加したOkHttpClient オブジェクトの作成を考える。
サービスによって種類の違うインターセプタを渡したOkHttpClient オブジェクトを使用したい場合、
OkHttpClient オブジェクトの作成方法を複数用意する必要があり、
複数の作成方法を修飾子をつけて定義することで識別していく。

修飾子の作成
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AuthInterceptorOkHttpClient

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class OtherInterceptorOkHttpClient
モジュールの定義

インスタンスの作成方法を定義する@Binds メソッドまたは @Provides メソッドに、
上記で作成した修飾子のアノテーションをつける。
どちらもOkHttpClientを返すが違うインターセプタを渡している。

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

  @AuthInterceptorOkHttpClient
  @Provides
  fun provideAuthInterceptorOkHttpClient(
    authInterceptor: AuthInterceptor
  ): OkHttpClient {
      return OkHttpClient.Builder()
               .addInterceptor(authInterceptor)
               .build()
  }

  @OtherInterceptorOkHttpClient
  @Provides
  fun provideOtherInterceptorOkHttpClient(
    otherInterceptor: OtherInterceptor
  ): OkHttpClient {
      return OkHttpClient.Builder()
               .addInterceptor(otherInterceptor)
               .build()
  }
}
インスタンスを提供

その実装でインスタンスを作成するのか、
インスタンスの前にもモジュール内で設定したのと同じアノテーションをつけて知らせる。
(authInterceptorを追加したOkHttpClientを提供する場合は@AuthInterceptorOkHttpClientをつける。)

@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

  @Provides
  fun provideAnalyticsService(
    @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient
  ): AnalyticsService {
      return Retrofit.Builder()
               .baseUrl("https://example.com")
               .client(okHttpClient)
               .build()
               .create(AnalyticsService::class.java)
  }