Как получить доступ к классам модулей приложения из библиотечных классов в Android?

Я создал два модуля в одном проекте Android.

  1. модуль приложения (который по умолчанию мой модуль приложения)

  2. и еще один добавленный библиотечный модуль.

Теперь в модуле приложения есть много классов Java. я хочу получить доступ .Java class модуля приложения в модуле библиотеки.

Модуль приложения имеет класс DatabaseHelper в упаковке xyz

Теперь я хочу импортировать класс DatabaseHelper в Library модуль.

DatabaseHelper не распознается андроидом.

Вопросы,

Можно ли импортировать класс из модуля приложения в другой модуль?

Любым другим путем.

Мои файлы

build.gradle(приложение)

compile project(':materialList')

setting.gradle

include ':app', ':Library'

2 ответа

Можно ли импортировать класс из модуля приложения в другой модуль?

Это будет невозможно, так как это создаст круговую зависимость.

Однако в этом сценарии может использоваться шаблон:

  • Определите тип данных: DatabaseHelperContent в library модуль
  • Определите интерфейс DatabaseHelperI в модуле библиотеки, разработчик которого должен предоставлять данные.
  • Создайте класс DatabaseHelperImpl, реализующий интерфейс DatabaseHelperI, предоставляющий данные (этот класс находится в app модуль)
  • Инициализируйте интерфейс как экземпляр класса ABC при обращении к нему в классе Application, чтобы данные из класса можно было динамически передавать в субмодуль.

Это стало бы еще проще с некоторой структурой внедрения зависимостей, такой как Dagger, где вы можете просто указать поставщика интерфейса в классе @Module и использовать внедренные данные от общего поставщика везде.

Нет, нет пути. Переосмыслите свой дизайн. Может быть, двигаться DatabaseHelper в library проект?

В вашем дизайне будет круговая зависимость между app модуль и library модуль.

Цель других модулей - отделить полностью независимые части кода и переместить их во внешнее место. И использовать их в других модулях.

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

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

Итак, если вам нужно получить доступ к ресурсу из модуля приложения в модуле библиотеки,
это легко сделать с помощью внедрения зависимостей.

Например, с Dagger это можно сделать так:

1. Создайте модуль, который будет предоставлять общий ресурс. Назовем его модулем интеграции.

@Module()
class IntegrationModule {

    @Provides
    @Named("foo")
    fun provideFoo() = "Hey bro"
}

2. Включите его в свой компонент приложения

@Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    IntegrationModule::class,
    YourLibraryModule::class
])
@Singleton
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun app(app: Application): Builder

        @BindsInstance
        fun context(context: Context): Builder

        fun build(): AppComponent
    }
}

3.Закройте его где-нибудь в своей библиотеке

@Inject @Named("foo") lateinit var foo: String

Вот и все.
Код реализации Base Dagger опущен для простоты.