Ответ
Dagger 2 - самый популярный DI фреймворк для Android. Он генерирует код во время компиляции, что обеспечивает высокую производительность. Работает на основе аннотаций (@Inject, @Module, @Component).
Пример:
@Component
interface AppComponent {
fun inject(activity: MainActivity)
}
@Module
class NetworkModule {
@Provides
fun provideApiService(): ApiService = Retrofit.create()
}
class MainActivity : AppCompatActivity() {
@Inject lateinit var apiService: ApiService
// ...
}
Koin - легковесный DI-фреймворк, использующий DSL Kotlin. Не требует кодогенерации, проще в настройке, но менее производительный.
Пример:
val appModule = module {
single { ApiService() }
}
class MainActivity : AppCompatActivity() {
private val apiService: ApiService by inject()
}
Hilt - обертка над Dagger от Google, упрощающая его настройку для Android.
Ответ 18+ 🔞
Слушай, давай про эти ваши DI-фреймворки, а то народ путается, как слепой кот в сортире. Ну, есть тут три основных персонажа, и у каждого своя хитрая жопа.
Dagger 2 — это, бля, как старый, матерый дядька в гараже, который всё делает по уму, но чтобы его уговорить, нужно танцевать с бубном. Самый популярный, да. Он такой: «Я кодогенерацией занимаюсь, производительность у меня овердохуища, но ты, сынок, аннотациями меня задобришь». Работает на этих самых @Inject, @Module, @Component. Выглядит серьёзно, но иногда от его конфигурации волнение ебать, терпения ноль ебать.
Вот смотри, как он обычно выёбывается:
@Component
interface AppComponent {
fun inject(activity: MainActivity)
}
@Module
class NetworkModule {
@Provides
fun provideApiService(): ApiService = Retrofit.create()
}
class MainActivity : AppCompatActivity() {
@Inject lateinit var apiService: ApiService
// ...
}
Видишь? Всё чётко, по-взрослому. Но если накосячишь в настройке — получишь ошибку компиляции, от которой сам от себя охуеешь. Он тебе сразу: «Чувак, э бошка думай, где ты тут хуй с винтом прикрутил».
Дальше идёт Koin. А это уже другой тип — весёлый, простой парень на Kotlin DSL. Никакой кодогенерации, всё в рантайме, настраивается за пять минут. Лёгкий, понятный, но за простоту платишь производительностью — он медленнее на старте, это факт. Для маленьких проектов — то, что надо, а для огромных можно и призадуматься.
Выглядит всё почти как магия, только попроще:
val appModule = module {
single { ApiService() }
}
class MainActivity : AppCompatActivity() {
private val apiService: ApiService by inject()
}
Красота, да? Никаких ебушки-воробушки с кодогенерацией, написал модуль и пользуешься. Но чуешь подвох? Если зависимостей станет овердохуища, инициализация может тянуться, как жвачка. Доверия ебать ноль к его скорости в больших приложениях.
И наконец, Hilt. Это, можно сказать, наш ответ Чемберлену от самого Google. Представь: взяли этого крутого, но строгого Dagger, надели на него удобную футболку с надписью «Для Android» и сказали: «Расслабься, чувак». Hilt — это обёртка, которая делает Dagger человечнее. Меньше шаманства с компонентами, всё заточено под андроидовские жизненные циклы.
Он как бы говорит: «Зачем тебе, ебанько, самому всё собирать? Я тебе стандартные компоненты дам, а ты только модули пиши». Идея в том, чтобы Dagger не взъебывал тебя своей сложностью, а работал из коробки. Говорят, золотая середина.
Так что выбор, в общем-то, понятен. Хочешь максимальную производительность и контроль — терпи неудобства Dagger 2. Ценишь простоту и скорость разработки на небольших проектах — бери Koin, да похуй. А если нужна мощь Dagger, но без головной боли — смотри в сторону Hilt, там тебе и гугл поможет. Главное — не преврати свой код в пиздопроебибну из-за неправильного выбора.