Comments 23
Спасибо за ссылку. На первый взгляд подходы достаточно похожи.
Посмотрю внимательнее, возможно, применим у себя.
У вас кстати есть такая проблема с деревьями?
В данном случае, нужно чтобы у активити был свой компонент и к нему можно привязать сколько угодно других компонентов. Когда компонент активити умрёт, то и все привязанные к нему компоненты тоже освободятся (помрут, если не используются где-то ещё).
Случай с активити описан в указанной статье. Обратите внимание на особенности работы с компонентом активити.
Есть ли прирост в производительности в данном подходе от того, что предлагал Евгений Мацюк? В каком случае стоит переходить на этот?
Улучшения, по сравнению с подходом Евгения, были связаны больше с решением выявленных архитектурных недостатков и появившимися возможностями Kotlin. Как мне кажется, производительность будет больше зависеть от конкретной реализации и используемого DI-фреймворка.
Этот подход полностью совместим с предыдущим, поэтому переходить можно постепенно при добавлении новых модулей.
C Котлином часть вещей упростилась. Ну и плюс опыт, конечно же.
Совсем необязательно связывать модули через один AppComponent. В примере так сделано только потому, что там всего три маленьких фиче-модуля.
При масштабировании, если фичи достаточно хорошо изолируются по зависимостям, их склейку можно разбивать по разным Dagger-компонентам внутри app-модуля.
Мы пока делаем для каждого фиче-модуля отдельный Dagger-модуль в app. Разделение AppComponent у нас в планах после вынесения всех фиче-модулей из монолита.
Спасибо за статью, я столкнулся с трудностью управления зависимостями между Feature модулями, когда делал мульти-модульный проект по "предыдущей" статье, и сам пришел к Module-injector.
Это интерфейс-маркер. Такой же, как, например, Serializable
. Он способствует читаемости кода.
Модуль принимает на вход Dependencies
и выставляет свой контракт в виде API
.
Если в его API
два или более классов (хотя лучше использовать в API
только интерфейсы) можно использовать композицию, например:
interface SomeFeatureApi : BaseAPI {
fun firstInteractor(): FirstInteractor
fun secondInteractor(): SecondInteractor
}
Если же используем интерфейсы, то можно просто отнаследовать FeatureApi от них, например:
interface SomeFeatureApi : BaseAPI, FirstInteractor, SecondInteractor
habr.com/ru/post/536106
@Phansier , спасибо за статью - мы как раз в процессе рефакторинга. Скажите, как вы подключаете вьюмодели в фича модулях? Фабрика уходит в коммон и подключается в каждый модуль в отдельности? Откуда тогда локально брать мапу viewModel-провайдеров? А если подключиние строго в app-module - прокидываете объект фабрики в модуль? Очень интересно в общем, т.к. ломаю над этим голову второй день. В ваших классных примерах viewModel-и почему-то не представлены.
Еще раз про многомодульность Android-приложений