使用具有相似依赖关系的两个不同模块创建 guice 注入器

roc*_*god 4 java dependency-injection guice

假设我有两个模块ModuleAModuleB它们是自给自足的,可以用作独立模块。这两个模块都依赖于第三个模块,ModuleC例如

install(new ModuleC());
Run Code Online (Sandbox Code Playgroud)

现在,我有一个用例,我需要使用两个模块 A 和 B 创建一个注入器。 我这样做了:

Guice.createInjector(new ModuleA(), new ModuleB());
Run Code Online (Sandbox Code Playgroud)

CreationException按预期抛出了一个,表示已经在其中一个模块中配置了对某个类的绑定。请记住,我没有改变的动力ModuleAModuleB,我怎么做工作?

我尝试使用,Modules.combine(Modules... modules)但这并没有解决我的问题。有什么解决方案吗?

zep*_*lin 10

考虑您定义了以下绑定:

模块C

  • C1

模块A

  • A1
  • A2

模块B

  • B1
  • B2

现在,当您执行Guice.createInjector(new ModuleA(),new ModuleB())or 时Modules.combine(..),您的最终绑定列表将是:

  • A1
  • A2
  • B1
  • B2
  • C1(继承自 A)
  • C1 (!)(继承自 B)

由于 C1 绑定被列出两次,这会产生冲突并导致CreationException.

但是如果你使用Modules.override()代替:

返回一个构建器,该构建器创建一个模块,该模块将覆盖模块覆盖在给定模块上。如果在两组模块中都绑定了一个键,则仅保留来自覆盖模块的绑定。

例如通过做

Modules.override(new ModuleA()).with(new ModuleB())
Run Code Online (Sandbox Code Playgroud)

您的最终绑定列表如下:

  • A1
  • A2
  • B1
  • B2
  • C1(继承自 A)
  • C1(继承自 B)

ModuleA继承的 C1 绑定将被删除,以支持ModuleB 中定义的 C1 绑定,从而解决冲突。