Рекомендуемая Jetpack библиотека внедрения зависимостей

Что такое внедрение зависимостей?

Внедрение зависимостей (DI) уже довольно давно широко используется в программировании. DI - это метод, с помощью которого класс получает другие объекты, от которых он зависит, вместо того, чтобы создавать их сам по себе. Реализация внедрения зависимостей дает вам следующие преимущества:

  • Возможность повторного использования кода
  • Легкость рефакторинга
  • Легкость тестирования

Основы внедрения зависимостей

При разработке приложения классу могут потребоваться ссылки на другие классы. Например, классу Car может потребоваться ссылка на класс Engine. Эти обязательные классы называются зависимостями, и в этом примере класс Car зависит от наличия экземпляра класса Engine для запуска. Мы можем предоставить эти необходимые зависимости тремя разными способами:

  1. Зависимый класс создает экземпляры или объекты зависимостей внутри себя. В нашем случае создание объекта класса Engine внутри класса Car.
  2. Использование объектов откуда-то еще. Как мы используем геттеры Context и getSystemService().
  3. Предоставление зависимостей в качестве параметров зависимым классам. В нашем случае передача объекта Engine в качестве параметра классу Car либо через функции конструктора, либо через функции установки.

DI хорошо подходит для разработки под Android. Если вы когда-либо использовали Dagger, официальную структуру DI или любую другую библиотеку DI для Android, вы будете знать, сколько усилий и шаблонного кода потребуется для создания всех необходимых зависимостей вручную. Для меня, когда я начинал использовать Dagger, понимать и внедрять вещи было похоже на кошмар. Потребовалось много дней, чтобы разобраться в вещах, и многое другое, чтобы их эффективно реализовать.

Введение в Dagger-Hilt

Из-за количества шаблонного кода и сложности реализации в текущих библиотеках DI команда Android придумала Hilt. Hilt предоставляет стандартный способ реализации DI в приложениях Android, предоставляя контейнеры для каждого класса Android в нашем проекте и автоматически управляя их жизненными циклами. Hilt был построен на основе Dagger, чтобы уменьшить усилия по выполнению DI вручную в проекте и получить преимущества от корректности времени компиляции, производительности во время выполнения, масштабируемости и т. Д.

Hilt - это упрощенная форма Dagger for DI в приложениях для Android с множеством других преимуществ.

Поскольку большинство из нас теперь адаптировано к компонентам Jetpack, Hilt теперь является рекомендуемой библиотекой Jetpack для внедрения зависимостей в Android. Hilt был разработан для Android с целью сэкономить время разработчиков.

Почему Эфес?

Основная цель Hilt - упростить инфраструктуру, связанную с Dagger, для приложений Android. Преимущества Hilt:

  • Уменьшенный шаблон
  • Независимые зависимости сборки
  • Упрощенная конфигурация
  • Улучшенное тестирование

Основы рукояти

Прежде чем приступить к реализации, давайте проверим терминологию, относящуюся к Hilt. Подобно Dagger, Hilt представляет собой фреймворк, полностью основанный на аннотациях. Вот несколько аннотаций, которые мы часто используем:

@HiltAndroidApp

Эту аннотацию необходимо применить к классу приложения, чтобы компонент был сгенерирован. Разве не все так просто по сравнению с Dagger?

@AndroidEntryPoint

Эту аннотацию необходимо применить к компонентам Android, таким как фрагменты, действия и т. Д., Чтобы внедрить зависимости.

В настоящее время Hilt поддерживает следующие классы Android:

  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

@Inject

Эта аннотация используется для выполнения инъекции. Он используется для внедрения зависимостей в зависимые классы. Зависимости могут быть введены через конструктор, поле или метод. Это похоже на Dagger.

Поля, введенные Hilt, не могут быть частными.

@Module

Эта аннотация используется над классом, в котором мы предоставляем зависимости, то есть где мы создаем объекты. Это похоже на Dagger.

@InstallIn

Модуль Hilt помечен @InstallIn(ActivityComponent::class), потому что мы хотим, чтобы Hilt внедрил эту зависимость в класс Activity. Эта аннотация означает, что все зависимости в thisModule доступны во всех действиях приложения.

@Provides

Аннотация используется в модулях и над методами, где мы создаем объекты для передачи их в качестве зависимостей. Эта аннотация похожа на аннотацию в Dagger. В основном он используется для предоставления экземпляров сторонних библиотек.

Настройка рукояти

Сначала добавьте hilt-android-gradle-plugin плагин в build.gradle файл корневого уровня вашего проекта:

Затем примените плагин Gradle в app/build.gradle файле:

Наконец, добавьте следующие зависимости в app/build.gradle файл:

Настройка среды для начала использования Hilt завершена. Как только мы создадим и синхронизируем проект, мы сможем их использовать. Давайте начнем использовать Hilt!

Рукоять в действии

Давайте проверим, как внедрить простой класс в класс Application.

Чтобы указать Hilt, как предоставлять экземпляры типа, добавьте аннотацию @Inject к конструктору класса, который нужно внедрить. Информация, которую имеет Hilt о том, как предоставлять экземпляры разных типов, также называется привязками.

После того, как мы включили внедрение членов в наш Application, мы можем начать включение внедрения членов в другие наши классы Android, используя аннотацию @AndroidEntryPoint.

Рукоять поставляется с поддержкой Jetpack

Поскольку большинство из нас начали использовать библиотеки Jetpack, для поддержки Hilt for Jetpack требуются некоторые дополнительные зависимости.

В настоящее время Hilt поддерживает следующие компоненты Jetpack:

  • ViewModel
  • WorkManager

Давайте посмотрим, как создать простую ViewModel и внедрить ее в Activity. Аннотация @ViewModelInject используется в конструкторе объекта ViewModel для предоставления экземпляра ViewModel.

Внедрение этой ViewModel в Activity намного проще с помощью одной строчки кода:

private val sampleViewModel: SampleViewModel by viewModels()

viewModels() - это функция-делегат, которую можно использовать для внедрения ViewModel. Здесь нет необходимости использовать аннотацию @Inject. Если мы хотим использовать Activitylevel ViewModel, нам нужно применить функцию делегата activityViewModels() вместо viewModels().

Вся деятельность может выглядеть примерно так:

Подробнее о поддержке Jetpack читайте в документации.

Разве не весело вводить компоненты самым простым способом? Люди, которые начали использовать первые версии Dagger, поймут, насколько легко было использовать Hilt по сравнению с Dagger. Однако это был слой наложения поверх Dagger, знание основ всегда было важным. Начните использовать Hilt.

использованная литература

Внедрение зависимостей с помощью рукояти

Документация по рукояти

Пожалуйста, дайте мне знать ваши предложения и комментарии.

Спасибо за прочтение!