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