С какими DI фреймворками вы работали и каковы плюсы и минусы Dagger, Hilt, Koin?
Что проверяют
Понимаете ли вы, что такое внедрение зависимостей само по себе, и отличаете ли граф, собранный на компиляции, от разрешения зависимостей в рантайме. Выбор фреймворка тут повод: слушают, сможете ли вы обосновать решение цифрами и ограничениями проекта, а не модой.
Как отвечать
Сначала суть: зависимости приходят через конструктор, объект не достаёт их сам. Фреймворк лишь автоматизирует сборку графа.
- Dagger: генерация кода на этапе сборки (kapt, сейчас чаще KSP). Ошибки графа видны компилятору, в рантайме нет ни рефлексии, ни сюрпризов. Минусы: высокий порог входа, многословность, влияние на время сборки.
- Hilt: надстройка над Dagger от команды Android. Даёт готовый набор компонентов и скоупов, привязанных к жизненному циклу (
SingletonComponent,ActivityRetainedComponent,ViewModelComponent), аннотации@AndroidEntryPointи@HiltViewModel, удобную подмену модулей в тестах. Минус: рамки заданы, нестандартную иерархию компонентов придётся собирать уже на голом Dagger. - Koin: не фреймворк генерации, а реестр фабрик на Kotlin DSL. Никакой кодогенерации, конфигурация читается как обычный код, сборка быстрая. Минус главный: неполный граф выясняется в рантайме, а не на компиляции. Частично лечится проверкой модулей в тестах.
Закройте ответ выбором: новый проект на Android почти всегда Hilt, Dagger оправдан в большом многомодульном коде со своими компонентами, Koin хорош там, где важна скорость сборки и простота, а команда готова закрывать граф тестами.
Где спотыкаются
Повторяют, что Koin работает на рефлексии и потому медленный. Koin ищет фабрику по типу в обычной таблице, а не разбирает классы рефлексией. Реальная его цена не в скорости, а в том, что ошибка графа приезжает падением приложения.
Не могут объяснить скоупы. Вопрос «почему этот объект переживает поворот экрана, а этот нет» отделяет тех, кто читал документацию, от тех, кто копировал модули.
Называют внедрением зависимостей вызов get() из середины класса. Это локатор служб: зависимость остаётся скрытой, класс нельзя собрать в тесте без контейнера.