依存性注入はHiltベースから始めましょうか?


この記事では,Android Jetpack依存注入庫Hiltの基礎知識をまとめた.
依存注入の基礎部分を理解しているとします.私が整理した依存性注入の基礎に関する文章を読みたい場合は、以下のリンクで読むことができます.
依存注入(DI)は、依存注入にとって簡単ですか?アクセスの試行

🌱 依存注入方式


依存注入には3つの方法があります.
1.注入作成者
2.注入方法
3.現場注入
Android MVVM構造とRepository Patternを使用した開発では、Repository実装とViewModel実装で、主に以下の方法を使用しています.
class InjectTargetRepository(
	private val injectedAPI: InjectedAPI
)

class InjectTargetViewModel(
    private val injectedRepository: InjectedRepository
)
ただし、上記で作成したビューモデルをビューで使用するには、ビューにRepositoryオブジェクトを作成し、ビューモデルを作成するときにビューに注入する必要があります.これにより,ビューとRepositoryは密接な関係となる.
これらの問題を解決するために、Koin、Dagger、Hiltなどの依存性を注入するためにライブラリを使用します.その中でHiltについてお話しします

🗡 Hilt


HiltライブラリはDaggerベースのコンパイル時間にコードを生成するための依存注入ライブラリである.従来のDaggerライブラリはAnnotationやボイラプレートを多く使用しているため高い運動曲線を持つと考えられていたため使いにくい.
しかし、Androidの公式ブログによると、5月4日に「安定した解放」を使用して、これらの欠点を補い、Androidのフレームワークを適切に修正することができる.
詳細については、まず使用方法について説明します.
@HiltAndroidApp
class HiltExampleApplication: Application() {...}

@AndroidEntryPoint
class HiltActivity: Activity() {...}

@HiltViewModel
class HiltViewModel : ViewModel() {...}
上のコードに示すように、3つのデフォルトのAnnotationが存在します.
  • Androidのアプリ.  @HiltAndroidApp
  • EntryPoint  @AndroidEntryPoint
  • 提供  @HiltViewModel
  • 次に、モジュールが正常に注入されるには、次の手順に従ってAndroidクラスにコンストラクション関数注入を行う必要があります.注入時  @Inject  Annotationを使用します.
    @HiltViewModel
    class SimpleViewModel
    @Inject
    constructor(
      	private val simpleRepository: SimpleRepository
    ) : ViewModel() { ... }
    そして.  @HiltViewModel  Android AAC ViewModelへの注入もサポートされています.また、Navigation Graphを使用して作成されたSharedView Modelもサポートされています.
    @AndroidEntryPoint
    class SimpleFragment: Fragment() {
      	private val simpleViewModel: SimpleViewModel by viewModels()
      	private val simpleSharedViewModel: SimpleSharedViewModel by hiltNavGraphViewModels(R.id.simple_graph)
      	...
    }
    では,以上のコードでは構造関数注入が行われているが,これら注入するモジュールはどのように生成されるのか.
    @Module
    @InstallIn(SingletonComponent::class)
    object SimpleModuleObject {
      	@Provides
      	fun provideSimpleModule(): SimpleInterface = SimpleInterfaceImpl
    }
    @Module
    @InstallIn(SingletonComponent::class)
    abstract class SimpleModuleAbstract {
      	@Binds
      	abstract fun bindSimpleInterface(simpleInterfaceImpl: SimpleInterfaceImpl): SimpleInterface
    }
    上記のコードに示すように、モジュールを作成する場合、デフォルトでは4つのAnnotationが必要です.
  • @module
  • @InstallIn
  • @Provides
  • @Binds
  • @module Annotation

    @HiltAndroidApp@AndroidEntryPoint ,  例えば、@HiltViewModelは、オブジェクトまたはクラスがHiltに依存性を注入するためのモジュールであることを示す.

    @InstallIn Annotation


    モジュールをインストールする場所を示します.次のコンポーネントをインストールできます.

    これらの構成部品のライフサイクル.  次のリンクを参照してください.

    @Binds Annotation


    注入が必要なモジュールにインタフェースがある場合は、作成者を注入できないため、インタフェースのインプリメンテーションをバインドします.主にAndroidがRepository Patternを使用する項目では、Repository Layerを例として使用できます.

    @Provides Annotation


    外部ライブラリに作成されたインスタンスまたはジェネレータPatternによって作成されたインスタンスに注入オブジェクトを作成する場合に必要です.Androidは主に、RetrofitオブジェクトまたはOkHttpクライアントオブジェクトを単一のポイントで作成するために使用されます.

    ✅ Test


    では、Hiltを使用してテストコードをテストコードに適用する方法を見てみましょう.
    実際、HiltはUnit Testではあまり価値がありません.構造関数注入を行う場合,実際のモジュールを注入する必要がなく,モジュールのパッケージ依存性を注入するだけである.
    では、UIテストがどのように使われているかを見てみましょう.
    Android UIテストを行う場合、  @HiltAndroidTest  Annotationを使用します.
    @HiltAndroidTest
    class SimpleFragmentTest { ... }
    もちろん、基本モジュールを作成するように、テストクラスでテストで使用するモジュールを宣言することもできます.
    これまでHiltのデフォルトAnnotationと使い方,およびそれらの用途について理解してきた.
    Hiltは、コンパイル時に注入するためにコードを生成するため、コンパイル時にエラーをキャプチャする利点がある.
    他にもDIライブラリがありますが、Google公式ドキュメントでDIベストプラクティスで発表されているHiltは、他のライブラリよりもAndroidで安定していると思います.ちょっと使ってもいいです.

    References


    Hilt is stable! Easier dependency injection on Android
    「Hi付きAndroid DI」で依存注入
    Android Hiltについて
    Dagger HiltへのAndroid依存性の注入を開始