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

时间:2019-06-20 11:51:37

标签: java guice

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

一个简单的例子:我有一个List<SomeType>应该被注入,并且多个模块应该能够向该列表添加/绑定元素。 基本上是在不同模块之间使用绑定(或多绑定)。 我该怎么做到?哪种方法最好?什么都想不起来。

1 个答案:

答案 0 :(得分:1)

使用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());
}