Как стать автором
Обновить

Комментарии 23

Мы у себя в проекте для управления жизненным циклом компонента используем удобную библиотеку ComponentsManager.

Спасибо за ссылку. На первый взгляд подходы достаточно похожи.
Посмотрю внимательнее, возможно, применим у себя.

Там есть пара моментов, которые автор обещал доработать. Но пока они сильно не мешают работать.
Было бы прикольно, если в этой библиотеке поддерживались деревья компонентов. И тогда при уничтожении корня погибали бы и дочерние компоненты.
У вас кстати есть такая проблема с деревьями?
На данный момент проблемы нету. У нас в основном компонент привязывается к жизненному циклу активити или фрагмента. Нам как раз не хватает, чтобы к одному жизненному циклу можно было бы привязать несколько компонентов.
Данную проблему можно решить с применением подхода, описанного здесь: habr.com/ru/post/536106
В данном случае, нужно чтобы у активити был свой компонент и к нему можно привязать сколько угодно других компонентов. Когда компонент активити умрёт, то и все привязанные к нему компоненты тоже освободятся (помрут, если не используются где-то ещё).
Случай с активити описан в указанной статье. Обратите внимание на особенности работы с компонентом активити.

Есть ли прирост в производительности в данном подходе от того, что предлагал Евгений Мацюк? В каком случае стоит переходить на этот?

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

Мой подход был целиком для Java.
C Котлином часть вещей упростилась. Ну и плюс опыт, конечно же.
Насколько я понял: зависимости всех модулей прогоняются через один AppComponent, что при большом проекте с большим количеством фиче-модулей приведет этот файл к разрастанию до бесконечных размеров. Это приведет к снижению производительности. Сейчас наоборот идет тенденция отходить от даггеровских god-компонентов.

Совсем необязательно связывать модули через один AppComponent. В примере так сделано только потому, что там всего три маленьких фиче-модуля.
При масштабировании, если фичи достаточно хорошо изолируются по зависимостям, их склейку можно разбивать по разным Dagger-компонентам внутри app-модуля.

К сожалению, в реальном мире всегда есть логическая связанность у фичей. Хотелось бы увидеть решение для более сложных проектов. Решали ли вы в касперском эту проблему?

Мы пока делаем для каждого фиче-модуля отдельный Dagger-модуль в app. Разделение AppComponent у нас в планах после вынесения всех фиче-модулей из монолита.

Какое примерное количество всех модулей у вас в проекте? И какое количество feature из них?

Сейчас около 27 модулей, из них 18 feature-модуля.

В таком случае понятно, почему вы пока не столкнулись с жирным год компонентом. У нас более 190 модулей при около 130 фичевых, поэтому мы изначально решали проблему вынося все связки из app, но наткнулись на проблемы, которые у вас решены :)

Спасибо за статью, я столкнулся с трудностью управления зависимостями между Feature модулями, когда делал мульти-модульный проект по "предыдущей" статье, и сам пришел к Module-injector.

НЛО прилетело и опубликовало эту надпись здесь

Это интерфейс-маркер. Такой же, как, например, Serializable. Он способствует читаемости кода.

НЛО прилетело и опубликовало эту надпись здесь

Модуль принимает на вход Dependencies и выставляет свой контракт в виде API.
Если в его API два или более классов (хотя лучше использовать в API только интерфейсы) можно использовать композицию, например:


interface SomeFeatureApi : BaseAPI {
    fun firstInteractor(): FirstInteractor
    fun secondInteractor(): SecondInteractor
}

Если же используем интерфейсы, то можно просто отнаследовать FeatureApi от них, например:


interface SomeFeatureApi : BaseAPI, FirstInteractor, SecondInteractor 

@Phansier , спасибо за статью - мы как раз в процессе рефакторинга. Скажите, как вы подключаете вьюмодели в фича модулях? Фабрика уходит в коммон и подключается в каждый модуль в отдельности? Откуда тогда локально брать мапу viewModel-провайдеров? А если подключиние строго в app-module - прокидываете объект фабрики в модуль? Очень интересно в общем, т.к. ломаю над этим голову второй день. В ваших классных примерах viewModel-и почему-то не представлены.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий