【问题标题】:Dagger 2: What does @Module(includes =) do?匕首 2:@Module(includes =) 做什么?
【发布时间】:2017-05-03 20:24:43
【问题描述】:

我正在处理一个项目,我正在尝试使其尽可能模块化。

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

我的所有 Java 代码都有一个 gradle 模块,其中每个部分都有一个模块(例如,AboutModule 用于关于页面依赖项)。然后,对于整个“Core” gradle 模块,我有一个名为“CoreModule”的 Dagger 2 模块,如下所示:

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

我是否认为在所有应用程序代码所在的 Android gradle 模块中,我应该能够将该模块包含在一个组件中,然后该组件可以@Inject CoreModule 中列出的所有模块中的任何内容?

目前,我从这些组件中收到编译错误,表明它们注入的文件正在“要求”模块中没有的完全不同的类。

例如,我有一个 GitHubComponent,它被注入到 GitHubActivity 中,并且还尝试使用 @Inject 注释 GithubService 进行注入,但是编译器抛出了此类尝试注入另一个类的错误...在目标文件的任何地方都没有提到。我已对此进行了简化以尝试清除错误,但我没有看到哪里出错了。

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

【问题讨论】:

    标签: android dependency-injection module dagger-2


    【解决方案1】:

    请参阅Module.includes 的文档:

    附加的@Module-注释类,该模块由这些类组成。包含中的模块的去重贡献,以及它们的递归包含,都对对象图有贡献。

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

    【讨论】:

    • 谢谢。我在 Docs 页面上(尽管在我通勤回家的公共汽车上……)上找了很多次,但找不到。我一直在以正确的方式使用它们,这很棒。感谢您帮助清除!关于我的错误,我实际上已经发现这是因为 CoreModule 包含核心库中的所有模块,其中一些具有我正在使用的组件中未包含的依赖项(GitHubComponent,在这种情况下 - 版本和插件模块具有 GitHub 模块中未提供的另一个 Retrofit 存储库依赖项)。所以这也解决了这个问题!
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多