- koin android example — DI In Android
- Why Koin?
- How Koin Works ?
- Lines of code
- Here are the key functions.
- Koin Android Example
- 1. Add Dependencies
- 2. create network module
- create a retrofit instance
- Koin — библиотека для внедрения зависимостей, написанная на чистом Kotlin
- Как управлять внедрением зависимостей с помощью механизма временной области (scope)
- О чем эта статья
- Введение
- Области в Koin
- Настраиваемая область
- Koin-Android
- Дополнительные материалы
- Релиз Koin 1.0.0✨
- Установка Koin
- Koin DSL👍
- Модули ― определение пространства имён и видимости😎
- Новый Scope API⭐️
- Параметры внедрения✨
- Лучшие объявления определений☢️
- Koin для Java разработчиков🌈
- и мощный функционал для Android💪
- AndroidX Ready✅
- Прочие изменения⚙️
- Переход с версии Koin 0.9.x😱
- Проекты для начала работы. На Github🚀
- 👉 Rendez-vous @ insert-koin.io
koin android example — DI In Android
Working with dependency injection is one complex concept in android dependency injection. Because Dagger-2 had complicated the concept for me when I came into android.
In this tutorial,I have explained about another dependency injection framework that I recently adopted and how it has really simplified the process for me. That is Koin.
A pragmatic lightweight dependency injection framework for Kotlin developers. Written in pure Kotlin using functional resolution only: no proxy, no code generation, no reflection!
Office Website — https://insert-koin.io/
Why Koin?
Koin is easy, simple & well documented. It is perfect for encapsulated feature/library modules.
How Koin Works ?
The koin works on simple DSL model. Here we have to create module first. In this module all the dependent objects are there, then we have to load one or more modules in koin. Then, we are ready to use this object. Generally we are loading module in to koin in application class by calling startKoin method,then we can inject the object wherever we want,this how the Koin works.
With Koin, setting up dependency injection is kind of a manual process, you essentially plug your services into the module graphs and those dependencies will later get resolved at runtime.
Lines of code
Here are the key functions.
get() — is used inside constructors to resolve needed instances. I advise using named parameters to achieve a better definition & improve readability.
factory — is used to indicate that a new instance must be created each time it is injected.
single — indicates that a unique instance will be created at the beginning and shared on every future injection.
repositoryModule — contains examples of binding interfaces (domain’s repo interface with its actual implementation) you can read more here.
name — is used to name definitions. This is required when you want to have multiple instances of the same class with different types.
bind — additional Kotlin type binding for given bean definition
getProperty() — resolve a property
module — create a Koin Module or a submodule (inside a module)
viewModel — definition, and this enables you to define a viewModel dependency.
Scope — Koin’s scope allows you to define local scoped-dependencies that are short-lived, like a Presenter, View Adapter, or other service components that are meant to be short-lived within a defined scope, like an Activity’s scope.
Koin Android Example
1. Add Dependencies
Add dependencies to app build.gradle file.
2. create network module
create a retrofit instance
To learn more about Retrofit please check this.
Источник
Koin — библиотека для внедрения зависимостей, написанная на чистом Kotlin
Как управлять внедрением зависимостей с помощью механизма временной области (scope)
Для будущих студентов курса «Android Developer. Professional» подготовили перевод полезной статьи.
Также приглашаем принять участие в открытом вебинаре на тему «Пишем Gradle plugin»
О чем эта статья
Вы узнаете, как с помощью модулей Koin ограничивать область живучести зависимостей, относящихся к конкретному компоненту. Вы также познакомитесь со стандартными областями Koin и способами работы с настраиваемыми областями.
Введение
Разработчики ОС Android не рекомендуют использовать внедрение зависимостей (Dependency Injection, DI (англ.)), если в вашем приложении три экрана или меньше. Но если их больше, лучше применить DI.
Популярный способ реализации DI в Android-приложениях основан на фреймворке Dagger. Но он требует глубокого изучения. Одна из лучших альтернатив этому фреймворку — Koin, библиотека, написанная на чистом Kotlin.
Если вы уже пользовались Dagger или любой другой библиотекой для DI, то, скорее всего, знаете, насколько важен в этом процессе механизм временной области (scope). Он позволяет определять, в каких случаях нужно получать один и тот же зависимый объект, а в каких — новый. Он также помогает освобождать невостребованные ресурсы и память.
Области в Koin
Концепция области в Koin аналогична таковой в Android. Она позволяет, например, ограничить область живучести модели представления (ViewModel) до определенной активности и использовать эту модель во фрагментах, которыми наполняется активность.
Как правило, в Koin три вида временных областей.
single (одиночный объект) — создается объект, который сохраняется в течение всего периода существования контейнера (аналогично синглтону);
factory (фабрика объектов) — каждый раз создается новый объект, без сохранения в контейнере (совместное использование невозможно);
scoped (объект в области) — создается объект, который сохраняется в рамках периода существования связанной временной области.
Одиночный объект(single). Фабрика объектов(factory)
Область вида single при каждом запросе возвращает один и тот же экземпляр, а factory каждый раз возвращает новый экземпляр.
Настраиваемая область
Стандартные области single и factory в Koin живут в течение жизненного цикла модулей Koin. Однако в реальных сценариях использования требования к внедрению зависимостей будут отличаться.
Зависимости обычно нужны только на определенный период времени. Например, репозиторий OnBoardRepository в Android-приложении требуется только при регистрации пользователя. Как только пользователь авторизуется, удержание этого репозитория в памяти станет лишней тратой ресурсов.
Чтобы добиться нужного поведения в Koin, можно воспользоваться API для работы с временными областями. В модуле Koin можно создать область со строковым квалификатором и объявить зависимости внутри нее с помощью уникальных квалификаторов. Давайте сделаем это шаг за шагом.
Шаг 1
Сначала создадим модуль, объявим пустую область и присвоим ей имя. В данном случае мы дали области имя CustomScope . Вы можете назвать ее в соответствии со своими требованиями. Вот как это выглядит:
Шаг 2
Следующим шагом объявим необходимые зависимости с использованием областей single и factory в соответствии с требованиями проекта. Ключевой момент заключается в присвоении областям уникальных квалификаторов. Вот так:
Шаг 3
Мы закончили настройку в модуле Koin. На этом шаге нам нужно создать область из того компонента, из которого мы импортируем нужные зависимости. Обычно области создаются из Android-компонентов, например Activity, Fragment и т. п.
Чтобы создать область, сначала нам нужно получить существующий экземпляр компонента Koin, а затем вызвать функцию createScope, передав ей идентификатор и имя области.
Получив CustomScope как значение параметра имени, Koin будет искать область, которую мы объявили под этим именем в модулях Koin. ScopeNameID — это идентификатор, который мы применяем, чтобы отличать одну область от другой. Он используется на внутреннем уровне в качестве ключа для поиска этой области.
Если вы обращаетесь к областям или создаете их из нескольких Android-компонентов, то вместо функции createScope рекомендуется использовать функцию getOrCreateScope . Из названий этих функций очевидно, что они делают.
Шаг 4
Наконец, создаем экземпляр зависимости, которую хотим использовать. Мы сделали это с помощью созданной нами области. Вот что получилось.
scopedName и factoryName — это квалификаторы, которые мы объявили внутри модуля Koin на шаге 2.
Шаг 5
Чтобы избавиться от зависимостей, созданных посредством stringQualifiedScope, в частности sampleclass , необходимо вызвать функцию close . Например, если вы хотите избавиться от созданных в этой области зависимостей при уничтожении активности, то нужно вызвать функцию close в рамках соответствующего метода onDestroy . Вот так:
Koin-Android
Выше описан общий подход к ограничению живучести зависимостей определенной временной областью. Его можно применять на любой платформе, поддерживаемой Koin. Будучи Android-разработчиком, теперь я бы хотел совместить механизмы области Koin и области жизненного цикла, чтобы свести к минимуму работу, которую мне приходится делать при каждом создании активности.
Для этого необходимо импортировать библиотеки Koin-Android. Добавьте следующие строки в узел dependencies файла build.gradle уровня приложения:
Теперь с целью сократить шаблонный код мы хотим, например, автоматически закрывать область в рамках метода onDestroy компонента Android. Это можно сделать путем привязки Koin к импорту зависимостей посредством lifecyclescope .
Для начала необходимо создать в модуле Koin область для зависимостей с компонентами Android. Как это сделать:
scoping dependency with android activity
Затем нужно выполнить внедрение зависимости в активности при помощи lifecyclescope :
Это позволит закрывать область при уничтожении активности, избавив нас от ручных операций. Вот так выглядит наш код:
Такой подход позволит автоматизировать работу по созданию областей, назначению квалификаторов и уничтожению областей. Кажется, что это простые действия, их можно выполнить и вручную. Но повторяющуюся работу важно автоматизировать, и по мере развития приложения это становится очевидно.
Дополнительные материалы
Подробнее о внедрении зависимостей читайте в другой статье о библиотеке Koin.
Чтобы узнать больше о Kotlin, прочитайте вторую часть статьи о программировании на Kotlin (продвинутый уровень).
Читайте о корутинах и других расширенных функциях Kotlin в статье о том, как научиться комбинировать потоки в Kotlin.
На этом все. Надеюсь, вы узнали что-то полезное для себя. Спасибо за внимание!
Подробнее о курсе «Android Developer. Professional». Записаться на открытый урок «Пишем Gradle plugin» можно здесь.
Источник
Релиз Koin 1.0.0✨
Oct 7, 2018 · 5 min read
Так, так, так… вот оно! Уважаемые пользователи Koin, настал момент релиза нашей первой стабильной версии Koin. Спустя чуть больше года после начальной версии, мы вернулись с крутыми фичами, которые упростят процесс разработки на Kotlin и внедрение зависимостей. Поехали. 👉
Установка Koin
Версия Koin 1.0.0 доступна на Jcenter. Как обычно, обновите свой скрипт Gradle, указав новый номер версии. Ниже представлен полный список проектов Koin:
Ссылка на гайд по установке с помощью Gradle.
Обратите внимание на проект koin-core-ext , в котором собраны расширенные и экспериментальные фичи (бывший koin-reflect )
Koin DSL👍
Koin это первый D S L фреймворк для внедрения зависимостей. Для объявления компонентов, вам нужно знать всего 4 слова:
- module — объявляет модуль, т.е. пространство для сбора всех ваших определений компонентов.
- single — объявляет синглтон определения данного типа. Koin хранит только один экземпляр этого определения.
- factory — объявляет фабричное определение данного типа. Koin создаёт новый экземпляр, каждый раз.
- get — разрешает компонентные зависимости.
single и factory ключевые слова, которые помогают построить компонент с помощью лямбда-выражения. В этом выражении можно использовать функцию get() для получения необходимой зависимости из контейнера Koin.
Мы создаём Koin «модули» и объявляем «single» или «factory» экземпляры определений, вот и всё. Ниже, простой пример Koin модуля с использованием Koin 1.0:
Модули ― определение пространства имён и видимости😎
Модуль позволяет использовать ваши определения, а также сделать логическое разделение между определениями (пространством имён) и ограничить их видимость.
Во фрагменте кода, представленном ниже, ComponentB и ComponentC будут видеть только определение ComponentA из их модуля. Если нам нужно запросить экземпляр ComponentA, мы должны использовать его имя (иначе, Koin не сможет выбрать из двух определений).
По умолчанию, Koin именует каждый компонент в зависимости от пространства имён модуля. В начале у нас будет два экземпляра типа ComponentA : ComponentB.ComponentA и ComponentC.ComponentA.
Ниже показано, как мы можем получить эти экземпляры:
Для определений и модулей, у нас есть два флага, чтобы задать дополнительное поведение:
- createdAtStart : создаёт экземпляр модуля/определения с функцией startKoin().
- override : изменение определения и модуля должно быть явным. Необходимо задать override=true для определения или модуля, которому нужно переопределить существующий контент.
В главе «modules» из справочной документации, можно узнать об этом поподробнее.
Новый Scope API⭐️
В предыдущей версии Koin, функция release() помогала высвобождать экземпляры из пути. Это было очень неявно и действительно очень полезно.
В Koin 1.0 появился Scope API. Как это работает? Scope — это фиксированная продолжительность времени, в течение которого существует объект. После истечения этого времени, объекты под влиянием scope не могут быть внедрены снова (они выбрасываются из контейнера).
Нам нужно специальное объявление определения, между временем жизни определений single и factory . Используйте ключевое слово scope, чтобы объявить scope определение:
Scope обозначен собственным идентификатором ― scope id. Чтобы разрешить scope определение, вам нужно создать ассоциированный scope с этим id. Однажды созданное, разрешение будет выполнено в отношении scopeId, указанному в DSL.
Scope API будет полезен для написания компонентов с ограниченным временем жизни (сессии аутентификации, кошельки, корзины…).
Параметры внедрения✨
API для внедрения зависимостей, позволяет использовать деструктурированное объявление Kotlin напрямую, чтобы описать значения параметров, для их внедрения на лету:
Для запроса экземпляра используйте функцию parametersOf(), чтобы указать, какие параметры нужно предоставить.
Документация по параметрам внедрения, доступна по ссылке.
Лучшие объявления определений☢️
Может показаться что Koin DSL недостаточно автоматизирован, потому что приходиться писать в конструкторах вручную, с функцией get.
Если вам это не по душе, то у нас есть хорошие новости. Мы запустили экспериментальный API билдер, чтобы писать определения «умным» способом, а также избавить вас от написания конструкторов. Вы можете использовать single , factory или scope определения непосредственно с данным типом, без всяких выражений.
Если у вас есть класс реализации, для согласования с интерфейсом используйте ключевое слово singleBy. Допускается два типа параметров: singleBy ().
Все эти ключи, всё ещё экспериментальные (и используют интроспекцию, чтобы получить конструктор вашего класса). Нам нужен ваш фидбэк по этому поводу😉
Они находятся в проекте koin-core-ext (краткая справка).
Koin для Java разработчиков🌈
Большое событие: появление проекта koin-java. Идея проекта в том, чтобы создать условия для простого старта и внедрения в Java, с помощью статических хелперов:
Вы должны описать Koin модуль в Kotlin, но все ваши классы могут быть в Java! KoinComponent static helper пришёл из класса KoinJavaComponent , а startKoin перенесён из KoinJavaStarter .
и мощный функционал для Android💪
Много было сделано для работы с Android! Проекты были переименованы, благодаря их функционалу. Теперь у нас есть следующие Android проекты:
Мы отказались от koin-android-architecture и koin-androidx.
Новая фича перенесённая из koin-android-scope , помогает привязать жизненный цикл компонента Android к Koin scope. В конце жизненного цикла, Koin закрывает ассоциированный scope. Функция bindScope привяжет Koin scope к текущему жизненному циклу.
Фича ViewModel в Koin, предоставляется проектом koin-android-viewmodel и преследует ту же цель: облегчить внедрение зависимостей для компонентов Android Architecture ViewModel.
Объявляйте класс ViewModel с помощью ключевого слова viewModel (доступно в формате API билдера, чтобы не писать конструктор). Используйте это в Activity или Fragment с помощью by viewModel() или getViewModel().
И последнее большое новшество: starKoin() отныне не требует запуска из класса Application. Функции нужен только экземпляр Context , чтобы работать и запускаться из любого Android класса:
DSL функции androidApplication() и androidContext() позволяют восстановить экземпляры Application и Context .
AndroidX Ready✅
Для тех, кто хочет протестировать новую package-систему Android, мы подготовили версию проектов для AndroidX. Вот они:
Функции те же, что и в стандартном пакете, но с новыми пакетами AndroidX.
Прочие изменения⚙️
Для koin-ktor и koin-spark теперь можно использовать koin-logger-slf4j логгер, чтобы облегчить себе логирование, с предпочитаемой имплементацией (logback, log4j …).
- Расширение Ktor было добавлено в классы Route и Routing.
- Теперь вы можете использовать Koin внутри Ktor, с помощью installKoin() и сохранить совместимость с автоматической перезагрузкой.
- SparkJava понадобится, чтобы расширить интерфейс SparkController, если вы захотите объявить контроллер.
Переход с версии Koin 0.9.x😱
Для тех, кто переходит со старой версии Koin, у нас есть страничка с помощью: https://insert-koin.io/docs/1.0/quick-references/upgrade/
Проекты для начала работы. На Github🚀
Все проекты, чтобы начать работу, доступны на Github. Их можно скачать архивом здесь.
👉 Rendez-vous @ insert-koin.io
Доступна новая версия сайта, с большими разделами:
Источник