【问题标题】:Using Dagger Multibinding across Gradle modules跨 Gradle 模块使用 Dagger 多重绑定
【发布时间】:2017-06-07 23:04:48
【问题描述】:

Dagger 的各位用户……我是在尝试做一些不可能的事情吗?下面是degraph 生成的我的应用程序的 Gradle 模块视图。

想象一下我的应用有一个导航抽屉。我希望根据通过多重绑定填充的集合添加抽屉中的列表项。这种多重绑定的贡献者跨越 > 1 个 Gradle 模块。 例如,从user 模块添加一个名为“帐户”的列表项,从legal 模块添加一个名为“条款和条件”的第二项,从search 添加一个“搜索”导航条目摇篮模块。这些模块可以被认为是独立的应用程序,当它们捆绑在一起形成完整的应用程序体验时。它们可以自行运行。

关于这方面的 Dagger 文档看起来像是 Guice 的复制粘贴,但有一个很大的复杂性。它指出;

"Dagger 允许你将多个对象绑定到一个集合中,即使在 使用多重绑定将对象绑定在不同的模块中。 "

...但这意味着 Dagger @Modules,对吗?是否可以跨 Gradle 模块填充多重绑定?我已经尝试过类似的事情,但它不是我所期望的(并非所有的贡献都被收集);

父应用

@Module
abstract class PluginModule {
  @Multibinds @NavigationContribution abstract Set<NavigationEntry> navigables();
}

legal 包含 Dagger @Module 的 Gradle 模块

@Module
class LegalModule {
  @Provides
  @NavigationContribution 
  @IntoSet
  static NavigationEntry provideLegalNavigation() {
    return ...;
  }
}

user 包含 Dagger @Module 的 Gradle 模块

@Module
class AccountModule {
  @Provides
  @NavigationContribution 
  @IntoSet
  static NavigationEntry provideAccountNavigation() {
    return ...;
  }
}

在运行应用时,调用时只有应用“上下文”下的贡献可用;

@Inject @NavigationContribution Set<NavigationEntry> navigationEntries();

其他贡献可以通过获取子 Gradle 模块的dagger.Component 并公开获取条目的方法来“手动”访问。

这违背了我的应用程序使用 multibinder 的目的。这可能吗?如果不是,为什么?

更新:与 Jeff 进行分类

所以,顶层模块注解是这样的;

@ApplicationLifecycle
@Component(
    modules = {
        OceanLifeModule.class,
        AddSpotActivityModule.class,
        ModelModule.class,
        PluginModule.class
    },
    dependencies = {
        NavigationComponent.class,
        LegalComponent.class,
        PreferenceComponent.class,
        DomainComponent.class
    }
)

【问题讨论】:

  • 您能否确认您列出的其他 Dagger 模块确实安装在您的顶级组件中?
  • 嗨,杰夫,感谢您回来。所以我的顶级组件安装了PluginModule 以及提供贡献的模块(AccountModuleLegalModule 等)。如果有意义,这些模块彼此相邻吗?我会画一张图片并将其添加到问题中。

标签: android gradle dependency-injection guice dagger


【解决方案1】:

@jeff-bowman - 我在这里缺少的只是PluginModule 上的includes = {}。 Zac Sweers 关于同一主题的一篇博文here 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2016-07-08
    相关资源
    最近更新 更多