匕首2:@Module(包括=)做什么?

时间:2017-05-03 20:24:43

标签: android dependency-injection module dagger-2

我正在开展一个项目,我正在努力使其尽可能模块化。

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

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

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

我是否正确地认为在所有应用程序代码所在的Android gradle模块中,我应该能够将该模块包含在Component中,然后该Component可以@Inject从CoreModule中列出的所有模块中获取任何内容?

目前我从这些组件中收到编译错误,表明他们注入的文件正在“询问”一个完全不同的类,而不在模块中。

例如,我有一个注入GitHubActivity的GitHubComponent并尝试使用@Inject注释GithubService注入,但是编译器抛出了这个类试图注入另一个类的错误......那个在目标文件中的任何位置都没有提到。我已经试着去试试这个错误,但是我没看到它出错的地方。

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

1 个答案:

答案 0 :(得分:9)

请参阅Module.includes的文档:

  

其他@Module - 用于编写此模块的带注释的类。包含的模块的重复数据删除贡献以及递归包含的内容都是对象图形的贡献。

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