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

标签 java dagger-2

我有几个在编译时不知道的模块(想想“插件”)。它们都实现了一个“标签”接口(interface)MyModule:public interface MyModule {}

感谢 ServiceLoader@AutoService,我已经实例化了它们。

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

《 Dagger 2》作者 seem to think这个问题与 StackOverflow 相关。我不相信它是这样,因为它看起来像是一个缺失的用例,但是好吧,我在这里给了他们怀疑的好处并将其发布。

我知道我可以使用 Guice 或 Dagger 1,但正如 Dagger 2 团队的门票中所述;我不需要任何反射(ServiceLoader),并且 Dagger 1 现已弃用。另外,建议切换到 Dagger 2(这就是我尝试将 Dagger 1 项目升级到 Dagger 2 的原因)。

最佳答案

就目前情况而言,这是不可能的,也是 outside of Dagger 2's charter 。请参阅项目概述的开头句(重点是我的):

Dagger is a fully static, compile-time dependency injection framework for both Java and Android.

当您要求对象图处理任意标记接口(interface)模块时,您就阻止了 Dagger 知道它将有权访问哪些 @Provides 方法,这剥夺了 Dagger 检查和连接组件的能力在编译时。因此,为了让 Dagger 支持您的用例,正如您所说的,它必须扭转许多核心架构决策以及编译时检查和代码生成的优势。虽然我不是 Dagger 团队的成员,但我想这会使其不适合可预见的 future ,我想这也是您的问题被标记为“按预期工作”的部分原因。

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

关于java - 如何在 Dagger 2 中添加未知数量的未知模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794112/

相关文章:

java - 强制执行刷新以获取新的主键 ID 来存储 EmbeddedId

android - 这是在单元测试中使用 Dagger 2 for Android 应用程序以使用模拟/伪造覆盖依赖项的正确方法吗?

android - 错误:找不到符号类BR

java - Hadoop:如何为每个值提供一个全局唯一 ID 号作为 Mapper 中的键?

java - 如何向在另一个按钮内创建的按钮添加功能?

java - 字符串连接中 string.concat 和 + 运算符的区别

java - 如何在 Tab 布局中设置 Tab 宽度?

Android Dagger 2 与 BaseActivity 可减少样板文件

android - 如何使用 Dagger 2 将多个组件注入(inject)到同一个对象中

android - Dagger 2 : Injecting to Activities from multiple subcomponents