使用google-guice注入列表的最佳方法是什么?

Nam*_*arl 12 java dependency-injection guice

我有三个类CircleBuilder,SquareBuilderTriangleBuilder实现了ShapeBuilder接口.

我需要使用google-guice 初始化我的FormBuilder并且特别是BuilderList(扩展List<ShapeBuilder>)每个类的一个实例.

什么是最好的方法?

我知道提供者方法和这样的东西:

@Provides
FormBuilder provideFormBuilder() {
    DatabaseTransactionLog instance = new FormBuilder ( <numerous parameters> );

    ShapeBuilder builder = null ; 
    builder = new CircleBuilder( <numerous parameters> ) ;  
    instance.addBuilder( builder ) ;

    builder = new SquareBuilder( <numerous parameters> ) ;  
    instance.addBuilder( builder ) ;

    // And so on

    return instance;
}
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须创建我的FormBuilder手动操作,这违背了使用guice的目的(因为它FormBuilder是我的对象图中的顶部元素).

我希望能够写出这样的东西:

bind(BuilderList.class).to(CircleBuilder.class);
bind(BuilderList.class).to(TriangleBuilder.class);
bind(BuilderList.class).to(SquareBuilder.class);
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Jef*_*ica 15

考虑Multibindings,它会像你的代码片段一样收集绑定.Multibinder没有提供列表,因为Multibinder设计用于绑定多个模块中的同一个集合,Multibinder列表的元素顺序取决于模块评估的顺序.

Multibinder<ShapeBuilder> shapeBinder =
    Multibinder.newSetBinder(binder(), ShapeBuilder.class);
shapeBinder.addBinding().to(CircleBuilder.class);
shapeBinder.addBinding().to(TriangleBuilder.class);
shapeBinder.addBinding().to(SquareBuilder.class);

// Now you can inject Set<ShapeBuilder>.
Run Code Online (Sandbox Code Playgroud)

或者,您的@Provides方法可以接受参数(例如CircleBuilderProvider<CircleBuilder>),这样您就可以让Guice创建除List本身之外的所有内容.Guice不仅会自动绑定所有绑定类型的提供者,而且还会在任何@Provides方法中注入每个参数.

@Provides List<ShapeBuilder> provideShapeBuilders(
    CircleBuilder circleBuilder,
    SquareBuilder squareBuilder,
    TriangleBuilder triangleBuilder,
    Provider<TrapezoidBuilder> trapezoidBuilderProvider) {
  return new ArrayList<ShapeBuilder>(
      circleBuilder,
      squareBuilder,
      triangleBuilder,
      trapezoidBuilderProvider.get(),
      trapezoidBuilderProvider.get());
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:multibinding需要另一个jar - > guice-multibindings-3.0.jar (3认同)