Что происходит, когда вы «включаете» модуль из другого модуля в Dagger?

#dagger

#dagger

Вопрос:

На странице документации Dagger говорится:

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

Это оставляет некоторые вопросы, на которые нужно ответить:

  • Каков на самом деле эффект от включения других модулей? (По крайней мере, кажется, что включенные модули не нужно создавать напрямую)
  • Законно ли / возможно ли включать один модуль несколько раз разными модулями? Что произойдет тогда?

Ответ №1:

Документация нуждается в улучшении.

Includes — это буквальное включение — все методы @Provides включенных модулей, полностью транзитивно, собираются вместе и рассматриваются как (по сути) часть анализируемого модуля. Итак:

 @Module(includes = BModule.class)
class AModule {
  @Provides A provideA(...) { ... }
}

@Module
class BModule {
  @Provides B provideB(...) { ... }
}
  

функционально идентично

 @Module
class JointModule {
  @Provides A provideA(...) { ... }
  @Provides B provideB(...) { ... }
}
  

Кроме того, включение модуля разрушает дубликаты. Итак, если у вас есть:

 @Module(includes = {BModule.class, CModule.class})
class AModule { ... }

@Module(includes = CModule.class)
class BModule { ... }

@Module
class CModule { ... }
  

это приведет к сбору привязок (удаленных из дублирования) из AModule BModule CModule .