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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for Naoya Naoya
April 15, 2023

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

第2回SandboxLT登壇資料

Avatar for Naoya

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