Какие знаешь DI фреймворки

Ответ

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, там тебе и гугл поможет. Главное — не преврати свой код в пиздопроебибну из-за неправильного выбора.