日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。

發布時間:2024/4/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Koin、Dagger2、Hilt 目前都是非常流行的庫,面對這么多層出不窮的新技術,我們該做如何選擇,是一直困擾我們的一個問題。

  • Hilt 與 Dagger2 區別并不大,Hilt就是對Dagger2的封裝。
  • Koin框架,適用于使用Kotlin開發 ,是一款輕量級的依賴注入框架,無代理,無代碼生成,無反射。

相對于Dagger2 而言Koin更加適合Kotlin語言。

Koin官網:https://start.insert-koin.io/#/quickstart/kotlin
GitHub:https://github.com/InsertKoinIO/getting-started-koin-core

https://github.com/Pangu-Immortal

在項目中使用 Koin

如果要在項目中使用 Koin,需要在項目中添加 Koin 的依賴,我們只需要在 App 模塊中的 build.gradle 文件中添加以下代碼。

implementation “org.koin:koin-core:2.1.5” implementation “org.koin:koin-androidx-viewmodel:2.1.5

如果需要在項目中使用 Koin 進行依賴注入,需要在 Application 或者其他的地方進行初始化。

class KoinApplication : Application() {override fun onCreate() {super.onCreate()startKoin {AndroidLogger(Level.DEBUG)androidContext(this@KoinApplication)modules(appModule)}} }

當初始化完成之后,就可以在項目中使用 Koin 了,首先我們來看一下如何在項目中注入 Repository, Repository 有一個子類 TasksRepository,代碼和上文介紹的一樣,需要在其構造函數構造 localDataSource 和 remoteDataSource 兩個 DataSource。

class TasksRepository @Inject constructor(private val localDataSource: DataSource,private val remoteDataSource: DataSource ) : Repository

那么在 Koin 中如何注入呢,很簡單,只需要幾行代碼就可以完成。

val repoModule = module {single { LocalDataSource(get()) }single { RemoteDataSource() }single { TasksRepository(get(), get()) } } // 添加所有需要在 Application 中進行初始化的 module val appModule = listOf(repoModule)

和上面 Hilt 長長的代碼比起來,Koin 是不是簡單很多,那么 Room、Retrofit、ViewModel 如何注入呢,也很簡單,代碼如下所示。

// 注入 ViewModel val viewModele = module {viewModel { MainViewModel(get()) } }// 注入 Room val localModule = module {single { AppDataBase.initDataBase(androidApplication()) }single { get<AppDataBase>().personDao() } }// 注入 Retrofit val remodeModule = module {single { GitHubService.createRetrofit() }single { get<Retrofit>().create(GitHubService::class.java) } }// 添加所有需要在 Application 中進行初始化的 module val appModule = listOf(viewModele, localModule, remodeModule)

上面 Koin 的代碼嚴格意義上講,其實不太規范,在這里只是為了和 Hilt 進行更好的對比。

到這里是不是感覺 Hilt 相比于 Koin 是不是簡單很多,在閱讀 Hilt 文檔的時候花了很長時間才消化,而 Koin 只需要花很短的時間。

不僅僅如此而已,根據 Koin 文檔介紹,Koin 不需要用到反射,那么無反射 Koin 是如何實現的呢,因為 Koin 基于 kotlin 基礎上進行開發的,使用了 kotlin 強大的語法糖(例如 Inline、Reified 等等)和函數式編程,來看一個簡單的例子。

inline fun <reified T : ViewModel> Module.viewModel(qualifier: Qualifier? = null,override: Boolean = false,noinline definition: Definition<T> ): BeanDefinition<T> {val beanDefinition = factory(qualifier, override, definition)beanDefinition.setIsViewModel()return beanDefinition }

內聯函數支持具體化的類型參數,使用 reified 修飾符來限定類型參數,可以在函數內部訪問它,由于函數是內聯的,所以不需要反射。

但是在另一方面 Koin 相比于 Hilt 錯誤提示不夠友好,Hilt 是基于 Dagger 基礎上進行開發的,所以 Hilt 自然也擁有了 Dagger 的優點,編譯時正確性,對于一個大型項目來說,這是一個非常嚴重的問題,因為我們更喜歡編譯錯誤而不是運行時錯誤。

總結

我們總共從以下幾個方面對 Hilt 和 Koin 進行全方面的分析:

  • AndroidStudio 支持 Hilt 在關聯代碼間進行導航,支持在 @Inject 修飾的構造器、@Binds 或者@Provides 修飾的方法、限定符之間進行跳轉。
  • 項目結構:完成 Hilt 的依賴注入需要的文件往往多于 Koin。
  • 代碼行數:使用 Statistic 工具來進行代碼統計,反復對比了項目編譯前和編譯后,Hilt 生成的代碼多于 Koin,隨著項目越來越復雜,生成的代碼量會越來越多。
  • 編譯時間:Hilt 編譯時間總是大于 Koin,這個結果告訴我們,如果是在一個非常大型的項目,這個代價是非常昂貴。
  • 使用上對比:Hilt 使用起來要比 Koin 麻煩很多,其入門門檻高于 Koin,在閱讀 Hilt 文檔的時候花了很長時間才消化,而Koin 只需要花很短的時間,依賴注入部分的代碼 Hilt 多于Koin,在一個更大更復雜的項目中所需要的代碼也更多,也越來越復雜。

    https://github.com/Pangu-Immortal

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。