Skip to content

octa-one/koinscopedemo

Repository files navigation

Демо приложение многомодульного DI фреймворка на основе Koin.

За основу приложения взяты примеры Максима Алова https://github.com/orcchg/DiRecall. Этот репозиторий можно рассматривать как ещё один способ организации DI в приложении.

Приложение загружает список пользователей Github и их репозитории. Для этого есть 3 фрагмента (фичи) :feature:github_user_list - список пользователей :feature:github_user_details - информация о пользователе :feature:github_repo - динамическая фича, репозитории пользователя

github_user_list и github_user_details имеют только impl gradle модули, потому что у них нет публичного api, а создавать пустые api модули излишне. Чтобы так же не создавать пустой FeatureApi, можно создавать FeatureImpl с конструктором по умолчанию и использовать этот FeatureImpl как FeatureApi.

Так же есть library модули :core:scheduler(-api) и :core:network(-api). В них FeatureApi заменяется на LibraryApi, разница только в том, что скоупы для LibraryApi никогда не будут закрываться, то есть scoped объявления в них будут работать как single. Это нужно чтобы например не уничтожать такие сущности как OkHttp клиент.

В этом примере изменена загрузка FeatureImpl в коин, она сделана лениво, потому что, как показала практика, создание большого числа лямбд с объявлениями занимает некоторое время на старте. Изменения видны в App и FeatureApiManager. В App вместо загрузки всех объявлений загружается мапа FeatureApi к FeatureImpl, и загружается при необходимости в loadScopeIfNeeded().

Тесты находятся в модуле app-test, не самое красиво решение, но так сделано, чтобы их динамических фичей получать доступ к overrideModules и implParameters. В будущем хорошо бы переписать это на использование gradle test fixtures.

overrideModules - это список объявлений, которые перезапишут объявления из фичей. Это нужно чтобы Koin не падал в unit тестах на создании классов привязанных к Android runtime (которого нет во время теста). В таких модулях настоящие реализации подменяются моками или фейками.

implParameters - объявления фейковых параметров для классов в коине. Параметры это объекты, передаваемые при получении класса, например val viewModel by viewModel<GithubRepoViewModel> { parametersOf(login) } Во время теста Koin не сможет получить эти объекты, поэтому их надо указать явно в implParameters. Подробнее про api для тестов коина можно почитать в документации: https://insert-koin.io/docs/reference/koin-test/checkmodules/

About

Koin Scope Demo App

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors