Dagger 2: @Module(includes =) 的作用是什么?

19

我正在开发一个项目,尽可能让它模块化。

我尝试使用@Module(includes = {})注解来实现我的目标,但效果并不好。

我有一个gradle模块来处理所有的Java代码,在其中每个部分都有一个模块(例如About页面依赖的AboutModule)。然后,在整个“Core”gradle模块中,我有一个Dagger 2模块叫做“CoreModule”,它看起来像这样:

@Module(includes = {
        AddonModule.class,
        VersionModule.class,
        AboutModule.class}
)
public class CoreModule {
}

我想知道在 Android Gradle 模块中的应用代码所在的组件中,我是否可以将该模块包含在一个组件中,然后该组件可以从 CoreModule 中列出的所有这些模块中 @Inject 任何内容?

目前,我从这些组件中获得了编译错误,表明它们注入到的文件正在“请求”一个完全不在该模块中的不同类。

例如,我有一个 GitHubComponent,它被注入到一个 GitHubActivity 中,并尝试使用 @Inject 注释来注入 GithubService,但编译器会抛出错误,表示该类正在尝试注入另一个类…但目标文件中并没有提到它。我已经简化了这个问题,以便找出错误所在,但我还没有看到它出错的地方。

我找不到任何关于这个方面的文档。 includes 部分实际上是做什么的?我是否使用正确,因此错误出现在其他地方?

1个回答

17

请查看Module.includes文档:

附加的@Module注释类,用于组成此模块。在这些模块及其递归包含中去重后的贡献都将被添加到对象图中。

简而言之,Module.includes 是一种添加对列出的模块(例如您示例中的 AddonModule、VersionModule 和 AboutModule)的依赖项的方法,以及从包含封闭 Module(例如您示例中的 CoreModule)的任何内容中使用。


1
谢谢你。我在文档页面上找了很久(虽然是在坐公交车回家的路上...),但没找到。我一直在正确使用它们,这太棒了。感谢您帮助澄清这一点!关于我的错误,我已经发现这是因为CoreModule包含Core库中的所有模块,其中一些模块具有依赖项,而这些依赖项未包含在我使用的组件(在这种情况下是GitHubComponent)中。所以这也解决了! - MattBoothDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接