Guice - 如何让多个模块为一件事做出贡献?

Guice - How to let multiple multiple modules contribute to one thing?

我想知道是否可以让模块进行特定绑定,然后注入这些绑定的组合。

简单示例:我有一个 List<SomeType> 应该被注入并且多个模块应该能够 add/bind 元素到该列表。 基本上跨不同模块使用绑定(或多绑定,就此而言)。 我怎样才能做到这一点,哪种方法最好?想不出来了

使用 Multibinder 扩展

但是...您必须使用 Set 而不是 List

此外,在开始之前,请注意虽然 Multibinder 是一个扩展,但它已经集成到几个版本的主要 Guice 工件中。

像这样创建一个通用的静态方法:

public static LinkedBindingBuilder<SomeType> bindSomeTypeSetElement(Binder binder) {
  return Multibinder.newSetBinder(binder, SomeType.class).addBinding();
}

我告诉你写这样一个方法是因为以后找到绑定定义会更容易,如果你想把SomeType改成OtherType,用一种方法更容易完成。最后,如果您想更改绑定(例如使用注释进行标识),也更容易。

现在在您想要绑定的模块中,只需在您的 configure 方法中编写以下代码:

import static path.to.SomeTypeBinder.bindSomeTypeSetElement;

public void configure() {
  bindSomeTypeSetElement(binder()).toInstance(new ConcreteType());
  bindSomeTypeSetElement(binder()).to(SecondConcreteType.class);
  bindSomeTypeSetElement(binder()).toProvider(new ThirdConcreteTypeProvider());
}