Nam*_*arl 12 java dependency-injection guice
我有三个类CircleBuilder,SquareBuilder并TriangleBuilder实现了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方法可以接受参数(例如CircleBuilder或Provider<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)