Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidアプリ開発におけるDIライブラリの比較

Naoya
April 15, 2023

 Androidアプリ開発におけるDIライブラリの比較

第2回SandboxLT登壇資料

Naoya

April 15, 2023
Tweet

More Decks by Naoya

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ  ໊લ େֶ ֶ෦ ֶ೥ ग़਎ झຯ Ұݴ ୩઒௚໻

    ձ௡େֶ ίϯϐϡʔλཧ޻ֶ෦ ֶ෦೥ Ѫ஌ݝ ອըɺ͓স͍ɺόΠΫɺཱྀߦ ݄͔Β೥χʔτͩɻ
  2. DI(Dependency Injection)の概要 • コンポーネント間の依存を外部から注入して、 クラス同士の結合を弱めるデザインパターン • 制御反転(Inversion of Control)の一種 •

    関心の分離により、疎結合なコードになるようにしている • AndroidにおけるDIは、コンストラクタインジェクションとフィールド インジェクションがある
  3. 各DIライブラリの概要~DaggerとHilt~ Daggerの特徴 • 柔軟な設定オプション • コンパイル時の依存関係検証 • Android開発に対する広範なサポ ートとドキュメント •

    アノテーションベースのDI Hiltの特徴 • セットアップの容易さ • デフォルトの設定 • Android Jetpackとの統合 • コンパイル時の依存関係検証 DaggerとHiltはJavaやKotlin、Android(Hiltのみ)で利用されるDIライブラリ
  4. 実装 ~KoinとHilt~ Koin val appModule = module { single<Repository> {

    RepositoryImpl() } viewModel { SampleViewModel(get()) } } class MyApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidContext(this@MyApplication) modules(appModule) } } } @Module @InstallIn(ApplicationComponent::class) abstract class HiltModule { @Binds abstract fun bindRepository(repositoryImpl: RepositoryImpl): Repository } @HiltAndroidApp class MyApplication : Application() @HiltViewModel class SampleViewModel @Inject constructor(private val repository: Repository) : ViewModel() { // ... } Hilt
  5. 実装 ~Kodein~ Kodein val appModule = DI.Module("appModule"){ bind<Repository>() with singleton

    { RepositoryImpl() } bind() from provider { SampleViewModel(instance()) } } class MyApplication : Application(), DIAware { override val di = DI.lazy { import(androidXModule(this@MyApplication)) import(appModule) } } class MainActivity : ComponentActivity(), DIAware { override val di by closestDI() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val viewModel: SampleViewModel by instance() val data = viewModel.data.collectAsState() SampleScreen(data = data.value) } } }
  6. DIライブラリの違い 項目 Koin Kodein Hilt 言語 Kotlin Kotlin, Java Kotlin,

    Java 設計哲学 シンプルさと簡潔さ 汎用性 Android向けの統合 DSL あり あり なし(アノテーション) パフォーマンス 良い 良い(リフレクション使 用) 非常に良い スコープ管理 拡張関数による簡単な 定義 タグを使用した定義 アノテーションによる定 義 プラットフォーム対応 Android, デスクトップ, サーバーサイド, KMM Android, デスクトップ, サーバーサイド Android専用 依存関係解決 実行時 実行時(リフレクション) コンパイル時 Jetpack統合 なし なし あり
  7. Credits and References - The deck was generated by SlidesGPT

    - https://dagger.dev/ - https://developer.android.com/guide/background-threading - https://dagger.dev/hilt/ - https://developer.android.com/training/dependency-injection/hilt-android - https://insert-koin.io/ - https://blog.logrocket.com/kotlin-dependency-injection-koin-vs-hilt/ - https://shimbaroid.hatenablog.jp/entry/2017/06/11/011103