Pull to refresh

Comments 14

Интересно было бы увидеть как реализуется этот пример с помощью Dagger 2, удивительно, что можно было такого наворотить, что стало его сложно использовать. Сколько не видел IoC-контейнеров, у всех было довольно простое и понятное api.
По Вашей просьбе добавил в конец статьи тот же пример на Dagger. Цель статьи не показать, что Koin лучше Dagger'а, а привести пример, что Service Locator можно использовать для Dependency Injection.
Когда валидируется граф зависимостей? Если я забыл зарегистрировать Engine, то используя Koin узнаю об этом только в рантайме? Это одна из главных причин почему сервис локатор и
является анти-паттерном.
Хороший комментарий. У Koin есть возможность провалидировать граф. Но для этого Koin создаёт каждую зависимость, что, с моей точки зрения, является костылём. С другой стороны, это работает и граф валидируется, пусть и не в compile time, а при прогоне соответствующего теста.
Собственно, так и делается. Пишется специальный тест, который гоняется на ci вместе с остальными тестами и про невалидном графе сборка просто падает.
Как раз начал попробовать Koin в проекте средне-крупного уровня. Есть несколько вопросов о которых ничего не увидел в документации или пропустил:
1) Хорошо ли проект ложится на много-модульность? Был бы рад увидеть best practice(создавать ли koin модули в каждом градл модуле или норм если всё внутри app модуля)
2) Какие вообще могут встретиться грабли, которые будут трудно решаемы по сравнению с даггером?
Koin прекрасно дружится с многомодульностью.

Определяете в каждом Android-модуле необходимые koin-модули (публичные). А уже из app достаёте их и указываете при инициализации Koin (startKoin метод).
А смысл так делать? В даггере можно было так делать скажем для уменьшения нагрузки на apt, а здесь какое преимущество?
Хотя бы прятать реализации за интерфейсами.
То есть вы весь код пропитываете единным интерфейсом сервис-локатора и при переносе некой части кода в другой проект тащите с собой этот интерфейс?
Эти части у вас на неком магическом клее? «Ну вроде должен прислать нужный объект».

Объект всегда можно привести в невалидное состояние — потому для надежности вам просто необходимо свой код покрывать даже не функциональными, а e2e тестами, тк вы должны быть уверенными, что именно в текущей реализации с текущим окружением сервис-локатор притащит вам именно тот самый интерфейс.

Извините, но даже для меня, программиста на динамическом скриптовом языке, это кажется не инженерно и не надежно и дорого по поддержке.
Про какую пропитку интерфейсом речь?
Я нигде у автора в конечно итоговом коде не вижу доп. интерфейсов:
interface Engine
class DefaultEngine: Engine
class Car(private val engine: Engine)

Тоже самое и в Даггере.
прошу прощения — прочитал поперек статью и не увидел, что автор оба примера привел. Писал про сервис-локатор
Dagger 2 тоже можно использовать как service locator, если дергать component откуда ни поподя. Это же относится к любому DI фреймворку. Поэтому не понятно, почему в интернете критикуют именно Koin.
Sign up to leave a comment.

Articles