В чем разница между Dagger и Koin
Что проверяют
Понимаете ли вы разницу между проверкой графа зависимостей на этапе сборки и в рантайме, и умеете ли выбирать по размеру проекта.
Как отвечать
Dagger (и надстройка Hilt) генерирует код на этапе компиляции: аннотации разбираются процессором, граф зависимостей собирается и проверяется до запуска. Отсутствующая или неоднозначная зависимость это ошибка сборки, а в рантайме остаётся обычный сгенерированный код без рефлексии.
Koin это библиотека на Kotlin с описанием модулей в виде DSL. Граф собирается во время работы приложения, поиск зависимости идёт по типу в реестре. Настройка проще, кодогенерации нет.
Отсюда сравнение по существу:
- когда узнаете об ошибке: Dagger на сборке, Koin при первом обращении к зависимости. У Koin есть проверка
checkModulesв тестах, и её стоит держать в CI, иначе падение случится у пользователя; - скорость сборки против скорости запуска: Dagger удлиняет сборку кодогенерацией, но почти ничего не стоит в рантайме. Koin собирается быстро, зато тратит время и память на разрешение зависимостей при работе;
- порог входа: Koin осваивается за вечер, Dagger требует понимания компонентов, областей видимости и модулей;
- экосистема Android: Hilt даёт готовые области под активности, фрагменты и
ViewModelи считается рекомендованным решением от Google; - мультиплатформенность: Koin работает и в общем коде KMP, Dagger привязан к JVM и Android.
Практический вывод: большое приложение с несколькими модулями и командой чаще берёт Hilt ради проверок на сборке, небольшое или мультиплатформенное берёт Koin ради простоты.
Где спотыкаются
Называют Koin фреймворком с внедрением через рефлексию. Рефлексии там нет, это поиск по реестру типов.
Не проверяют граф Koin тестом и получают падение при открытии редкого экрана.
Путают Dagger и Hilt: второй это надстройка над первым с готовыми областями видимости.