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)
  1. Для чего в Android нужен DI?

    DI (Dependency Injection) нужен для управления зависимостями между объектами, упрощения тестирования, улучшения читаемости кода и повышения гибкости приложения, позволяя легко заменять или изменять зависимости без изменения самого кода.

  1. Разница между DI и Service locator?

    DI предоставляет зависимости объектам извне, что делает их более гибкими и тестируемыми. Service Locator, наоборот, инкапсулирует логику поиска и создания зависимостей внутри самого объекта, что может усложнить тестирование и уменьшить прозрачность кода.

  1. Разница между Koin и Dagger?

    Koin поддерживает Kotlin DSL и строит граф в runtime. Dagger требует больше шаблонного кода и строит граф в compile time.