如何在Dagger 2中添加未知数量的未知模块?

时间:2016-09-30 14:40:31

标签: java dagger-2

我有几个模块,我在编译时不知道(想想"插件")。他们都实现了#34;标签"界面MyModulepublic interface MyModule {}

由于ServiceLoader@AutoService,我已经实例化了这些内容。

如何将它们全部添加到我的组件构建器?

Dagger 2撰写seem to think这个问题与StackOverflow有关。我不相信它,因为它看起来像一个缺失的用例,但是,我在这里给他们带来怀疑的好处并发布它。

我知道我可以使用Guice或Dagger 1,但正如Dagger 2队的门票中所说的那样;我不想要任何反射(条形ServiceLoader),现在不推荐使用Dagger 1。此外,建议切换到Dagger 2(这就是我尝试将Dagger 1项目升级为Dagger 2的原因)。

1 个答案:

答案 0 :(得分:2)

这是不可能的,也是outside of Dagger 2's charter。请参阅项目概述的开头句(强调我的):

  

Dagger是Java和Android的完全静态,编译时依赖注入框架。

当您要求对象图处理任意标记接口模块时,您将阻止Dagger知道它可以访问哪些@Provides方法,这使得Dagger无法检查和连接组件在编译时。因此,对于Dagger支持您的用例,正如您所声明的那样,它必须逆转许多核心架构决策以及编译时检查和代码生成的优势。虽然我不在Dagger团队中,但我认为这会使它在可预见的未来变得不合适,我想这是你的问题被标记为按预期工作的部分原因。

也就是说,有多种方法可以使用多个共存组件(每个插件一个)在核心应用程序中使用静态分析和代码生成,同时支持任意数量的插件。例如,如果您的插件具有可预测的依赖关系集,则可以创建new PluginModule(PluginFactory... factoriesToSupport),它将提供@Provides Set<Plugin> createPluginSet(Dep1 dep1, Dep2 dep2)遍历插件工厂并返回一组插件。此外,如果插件依赖项代表顶级Component的很大一部分,并且构建图形支持它,则可以将Component本身注入@Provides方法,然后让您单独构建的PluginFactory实例遵循它们自己的(静态分析代码生成的Dagger组件,用于生成插件实例。简而言之,只要您在Dagger中,您就需要使用Dagger的编译时分析规则,但在这些限制条件下,您仍然可以找到可行的解决方案。