Как создавать и управлять зависимостями в приложении (dependency injection)
Что проверяют
Понимаете ли вы сам принцип, а не только аннотации Hilt: зачем класс получает зависимости снаружи и как это помогает в тестах. Следом спрашивают про скоупы и чем Hilt отличается от Koin.
Как отвечать
Внедрение зависимостей означает, что класс не создаёт нужные ему объекты, а получает готовые снаружи. Основной вариант это внедрение через конструктор: зависимости видны в сигнатуре, объект нельзя создать недособранным, а в тесте вы просто передаёте фейк. Внедрение в поле (@Inject lateinit var) нужно там, где конструктором управляет система: Activity, Fragment, Service.
Инструменты на Android:
- ручной DI: контейнер в
Application, который собирает граф. Для небольшого приложения нормальный вариант, документация Android показывает его как первый шаг; - Dagger: граф проверяется при компиляции, код генерируется, ошибки видны до запуска. Цена: порог входа и время сборки;
- Hilt: надстройка над Dagger с готовыми компонентами под жизненный цикл:
@HiltAndroidApp,@AndroidEntryPoint,@HiltViewModel, скоупы@Singleton,@ActivityScoped,@ViewModelScoped. Рекомендуемый вариант для Android; - Koin: DSL на Kotlin без кодогенерации, по устройству ближе к сервис-локатору. Начать проще, но ошибка в графе по умолчанию всплывает в рантайме или в тесте с проверкой модулей. Работает и в Kotlin Multiplatform.
Покажите модуль: интерфейс привязываете к реализации через @Binds в абстрактном модуле, сторонние объекты вроде Retrofit или базы Room отдаёте через @Provides. Скоуп выбираете по времени жизни: сетевой клиент живёт как @Singleton, состояние экрана как @ViewModelScoped. Про сборку: Dagger и Hilt поддерживают KSP вместо kapt, и новые проекты переходят на него ради скорости.
Где спотыкаются
Путают DI с сервис-локатором. Если класс сам достаёт зависимости из контейнера, они спрятаны, и тест без контейнера уже не написать.
Вешают @Singleton на всё подряд. Объекты с состоянием экрана живут всё время работы приложения и держат лишнюю память.
Внедряют Context от Activity в синглтон. Это классическая утечка: после поворота экрана старую Activity сборщик мусора освободить не может.