Ответ
В Android-разработке есть несколько альтернатив прямым зависимостям между модулями:
- Интерфейсные модули - создание модуля с интерфейсами, который знают оба модуля, а реализация скрыта в implementation-модуле.
// :core-api
interface AuthService {
fun login()
}
// :app
val authService: AuthService = // получаем через DI
// :auth-impl
class AuthServiceImpl : AuthService {
override fun login() { ... }
}
-
EventBus/RxBus - коммуникация через события.
-
Dependency Injection (Dagger/Hilt) - внедрение зависимостей через DI-контейнер.
-
Navigation Component - для навигации между feature-модулями.
-
Dynamic Feature Modules - загрузка модулей по требованию.
-
Content Providers - для межпроцессного взаимодействия.
-
Local Broadcasts - для простой коммуникации.
-
Shared Preferences/Database - обмен данными через хранилище.
Лучший подход зависит от конкретного сценария - чаще всего используют комбинацию интерфейсных модулей и DI.