〈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) }