Рекомендуемая Jetpack библиотека внедрения зависимостей
Что такое внедрение зависимостей?
Внедрение зависимостей (DI) уже довольно давно широко используется в программировании. DI - это метод, с помощью которого класс получает другие объекты, от которых он зависит, вместо того, чтобы создавать их сам по себе. Реализация внедрения зависимостей дает вам следующие преимущества:
- Возможность повторного использования кода
- Легкость рефакторинга
- Легкость тестирования
Основы внедрения зависимостей
При разработке приложения классу могут потребоваться ссылки на другие классы. Например, классу Car
может потребоваться ссылка на класс Engine
. Эти обязательные классы называются зависимостями, и в этом примере класс Car
зависит от наличия экземпляра класса Engine
для запуска. Мы можем предоставить эти необходимые зависимости тремя разными способами:
- Зависимый класс создает экземпляры или объекты зависимостей внутри себя. В нашем случае создание объекта класса
Engine
внутри классаCar
. - Использование объектов откуда-то еще. Как мы используем геттеры
Context
иgetSystemService()
. - Предоставление зависимостей в качестве параметров зависимым классам. В нашем случае передача объекта
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. Если мы хотим использовать Activity
level ViewModel
, нам нужно применить функцию делегата activityViewModels()
вместо viewModels()
.
Вся деятельность может выглядеть примерно так:
Подробнее о поддержке Jetpack читайте в документации.
Разве не весело вводить компоненты самым простым способом? Люди, которые начали использовать первые версии Dagger, поймут, насколько легко было использовать Hilt по сравнению с Dagger. Однако это был слой наложения поверх Dagger, знание основ всегда было важным. Начните использовать Hilt.
использованная литература
Внедрение зависимостей с помощью рукояти
Пожалуйста, дайте мне знать ваши предложения и комментарии.
Спасибо за прочтение!