Работал ли с Dagger

Ответ

Да, работал с Dagger (Dagger 2/Hilt). Использовал его для dependency injection (DI) в Android-приложениях.

Ключевые моменты:

  • Компоненты – контейнеры для зависимостей (@Component).
  • Модули – источники объектов (@Module + @Provides).
  • Scopes – управление жизненным циклом зависимостей (@Singleton и др.).
  • Hilt – упрощённая версия Dagger для Android (автоматическая генерация компонентов).

Пример с Dagger:

@Module
class NetworkModule {
    @Provides
    fun provideRetrofit(): Retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com")
        .build()
}

@Component(modules = [NetworkModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)
}

Пример с Hilt:

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com")
        .build()
}

@AndroidEntryPoint
class MainActivity : AppCompatActivity() { ... }

Практиковал внедрение в ViewModel, WorkManager и кастомные компоненты.

Ответ 18+ 🔞

А, Dagger? Ну да, работал, конечно. Эта штука для dependency injection, если по-простому — чтобы не создавать объекты вручную в каждом углу кода, а чтобы система сама их подсовывала, куда надо. В Android-приложениях юзал.

Основные пиздели, которые нужно держать в голове:

  • Компоненты – это, блядь, такие контейнеры, где зависимости живут. Помечаешь @Component, и он знает, откуда что брать. Ёпта, как шкаф с инструментами, только для кода.
  • Модули – а это уже сами ящики в этом шкафу. @Module + @Provides. Тут ты прямо говоришь: «Вот, смотри, Retrofit делается вот так, бери его отсюда». Источник объектов, короче.
  • Scopes – а вот это уже для управления, сколько раз объект создавать. @Singleton — чтобы один на всё приложение был, а не чтобы каждый раз новый плодился. Без скоупов будет овердохуища одинаковых инстансов, и приложение сожрёт память как не в себя.
  • Hilt – это, ядрёна вошь, обёрточка сверху, чтобы не ебаться с Dagger'ом вручную. Он за тебя кучу компонентов сам сгенерирует. Для Android — просто сказка, а не инструмент. Раньше-то на чистом Dagger'е конфиги писать — это ж пиздец, полдня убить можно.

Вот смотри, как на чистом Dagger'е выглядело (старая школа):

@Module
class NetworkModule {
    @Provides
    fun provideRetrofit(): Retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com")
        .build() // Всё, Retrofit готов, бери и пользуйся
}

@Component(modules = [NetworkModule::class])
interface AppComponent {
    fun inject(activity: MainActivity) // И вот этим самым inject'ом всё в активити засовывалось
}

А теперь на Hilt'е (современная магия):

@Module
@InstallIn(SingletonComponent::class) // Сказал «установи в главный компонент» и всё
object NetworkModule {
    @Provides
    @Singleton // И чтоб один был на всё приложение, а не десять
    fun provideRetrofit(): Retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com")
        .build()
}

@AndroidEntryPoint // Воткнул одну аннотацию над активити...
class MainActivity : AppCompatActivity() { ... } // ...и всё, хуй с горы, зависимости сами придут!

Практиковал, конечно, не только в активити. Запихивал зависимости и в ViewModel, и в WorkManager для фоновых задач, и даже в свои кастомные компоненты делал, когда стандартных не хватало. Главное — понять принцип, а там уже, как говорится, ебушки-воробушки, только успевай модули плодить.