DI
Dependency Injection
Внедрение зависимости — процесс предоставления внешней зависимости программному компоненту. Если нужно получить объект какого-либо класса, то нужно знать, как его создавать и придоставлять все необходимые ему для это зависимости. За это отвечает специальный компонент, который работает с графом зависимостей. Зависимость - объект, который необходимо получить с помощью компонента, а граф зависимостей — это набор всех таких объектов и связей между ними. Чтобы получить объект, нужно поместить его в граф и описать, каким образом можно получить экземпляр этого класса. DI рекомендуется использовать во всех реальных проектах. Можно описывать создание объектов один раз и использовать их везде в приложении, а также легко контролировать их lifecycle.
• Увеличивает декомпозицию кода.
• Уменьшает сваязанность разных участков кода.
• Дает лучную тестируемость и масштабируемость.
• Позволяет разделить процессы получения и создания зависимостей.
@Inject
Используется в библиотеках для внедрения зависимостей, таких как Dagger или Hilt. Она указывает, что зависимость может быть автоматически создана и предоставлена через конструктор, поле или метод.
class Repository @Inject constructor() {}
Koin
Легковесная библиотека для внедрения зависимостей написанная на чистом Kotlin.
• Узнаем об ошибке в runtime а не в compile time.
• Не генерирует никакого кода нет обработки аннотаций и рефлексии более быстрый в compile time более медленный в runtime.
• Все на delegates и DSL.
• Для compile time есть koin annotations
Service locator
С локатором служб класс все еще отвечает за создание своих зависимостей (с помощью локатора). С DI классу предоставляются его зависимости. Он не знает и не заботится откуда они берутся.
Вопросы на собесе (3)
- Для чего в Android нужен DI?
DI (Dependency Injection) нужен для управления зависимостями между объектами, упрощения тестирования, улучшения читаемости кода и повышения гибкости приложения, позволяя легко заменять или изменять зависимости без изменения самого кода.
- Разница между DI и Service locator?
DI предоставляет зависимости объектам извне, что делает их более гибкими и тестируемыми. Service Locator, наоборот, инкапсулирует логику поиска и создания зависимостей внутри самого объекта, что может усложнить тестирование и уменьшить прозрачность кода.
- Разница между Koin и Dagger?
Koin поддерживает Kotlin DSL и строит граф в runtime. Dagger требует больше шаблонного кода и строит граф в compile time.