Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。
Koin、Dagger2、Hilt 目前都是非常流行的庫,面對這么多層出不窮的新技術,我們該做如何選擇,是一直困擾我們的一個問題。
- Hilt 與 Dagger2 區(qū)別并不大,Hilt就是對Dagger2的封裝。
- Koin框架,適用于使用Kotlin開發(fā) ,是一款輕量級的依賴注入框架,無代理,無代碼生成,無反射。
相對于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,代碼和上文介紹的一樣,需要在其構造函數(shù)構造 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 的代碼嚴格意義上講,其實不太規(guī)范,在這里只是為了和 Hilt 進行更好的對比。
到這里是不是感覺 Hilt 相比于 Koin 是不是簡單很多,在閱讀 Hilt 文檔的時候花了很長時間才消化,而 Koin 只需要花很短的時間。
不僅僅如此而已,根據 Koin 文檔介紹,Koin 不需要用到反射,那么無反射 Koin 是如何實現(xiàn)的呢,因為 Koin 基于 kotlin 基礎上進行開發(fā)的,使用了 kotlin 強大的語法糖(例如 Inline、Reified 等等)和函數(shù)式編程,來看一個簡單的例子。
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 }內聯(lián)函數(shù)支持具體化的類型參數(shù),使用 reified 修飾符來限定類型參數(shù),可以在函數(shù)內部訪問它,由于函數(shù)是內聯(lián)的,所以不需要反射。
但是在另一方面 Koin 相比于 Hilt 錯誤提示不夠友好,Hilt 是基于 Dagger 基礎上進行開發(fā)的,所以 Hilt 自然也擁有了 Dagger 的優(yōu)點,編譯時正確性,對于一個大型項目來說,這是一個非常嚴重的問題,因為我們更喜歡編譯錯誤而不是運行時錯誤。
總結
我們總共從以下幾個方面對 Hilt 和 Koin 進行全方面的分析:
使用上對比:Hilt 使用起來要比 Koin 麻煩很多,其入門門檻高于 Koin,在閱讀 Hilt 文檔的時候花了很長時間才消化,而Koin 只需要花很短的時間,依賴注入部分的代碼 Hilt 多于Koin,在一個更大更復雜的項目中所需要的代碼也更多,也越來越復雜。
https://github.com/Pangu-Immortal
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Zygote孵化frameworks进
- 下一篇: Mac全量编译ijkplayer生成An