Как получить доступ к классам модулей приложения из библиотечных классов в Android?
Я создал два модуля в одном проекте Android.
модуль приложения (который по умолчанию мой модуль приложения)
и еще один добавленный библиотечный модуль.
Теперь в модуле приложения есть много классов 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 опущен для простоты.