2013-01-07 13 views
7

Tôi có ba lớp CircleBuilder, SquareBuilderTriangleBuilder triển khai giao diện ShapeBuilder.Cách tốt nhất để chèn danh sách bằng google-guice là gì?

Tôi cần phải khởi tạo FormBuilder và đáng chú ý là BuilderList (mở rộng List<ShapeBuilder>) với một phiên bản của từng lớp bằng google-guice.

Cách tốt nhất là gì?

tôi biết về các phương pháp cung cấp dịch vụ và các công cụ như thế này:

@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; 
} 

nhưng nó sẽ có nghĩa là tôi phải tạo FormBuilder bằng tay của tôi mà đánh bại mục đích của việc sử dụng Guice (vì FormBuilder là yếu tố hàng đầu trong tôi đồ thị đối tượng).

Tôi rất muốn có thể viết một cái gì đó như thế này:

bind(BuilderList.class).to(CircleBuilder.class); 
bind(BuilderList.class).to(TriangleBuilder.class); 
bind(BuilderList.class).to(SquareBuilder.class); 

Bất kỳ ý tưởng?

Trả lời

9

Xem xét Multibindings, sẽ thu thập các liên kết rất giống với đoạn mã của bạn. Không có điều khoản cho danh sách thông qua Multibinder, vì Multibinder được thiết kế để liên kết với cùng một bộ sưu tập trong nhiều mô-đun, và thứ tự phần tử của danh sách Multibinder sẽ phụ thuộc vào thứ tự mà Mô-đun của bạn được đánh giá.

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>. 

Ngoài ra, your @Provides method có thể mất trong các thông số (ví dụ CircleBuilder hoặc Provider<CircleBuilder>), do đó bạn có thể có Guice tạo tất cả mọi thứ ngoại trừ danh sách riêng của mình. Không chỉ Guice sẽ liên kết nhà cung cấp của tất cả các loại ràng buộc tự động, nhưng nó cũng sẽ tiêm mọi thông số trong bất kỳ phương thức @Provides nào.

@Provides List<ShapeBuilder> provideShapeBuilders(
    CircleBuilder circleBuilder, 
    SquareBuilder squareBuilder, 
    TriangleBuilder triangleBuilder, 
    Provider<TrapezoidBuilder> trapezoidBuilderProvider) { 
    return new ArrayList<ShapeBuilder>(
     circleBuilder, 
     squareBuilder, 
     triangleBuilder, 
     trapezoidBuilderProvider.get(), 
     trapezoidBuilderProvider.get()); 
} 
+3

Lưu ý: multibinding đòi hỏi jar khác -> Guice-multibindings-3.0.jar –

0

Chúng ta có thể làm điều gì đó như thế này: -

@Override 
protected void configure() { 
    bind(ShapeBuilder.class).annotatedWith(Names.named("Circle")).to(CircleBuilder.class); 
    bind(ShapeBuilder.class).annotatedWith(Names.named("Triangle")).to(TriangleBuilder.class); 
    bind(ShapeBuilder.class).annotatedWith(Names.named("Square")).to(SquareBuilder.class); 
} 

Trong FormBuilder Lớp của bạn: -

class FormBuilder{ 
    List<ShapeBuilder> shapeBuilderList; 
    @Inject 
    public FormBuilder(@Named("Circle")ShapeBuilder circle, @Named("Triangle")ShapeBuilder triangle,@Named("Square")ShapeBuilder square){ 
     shapeBuilderList = new ArrayList<>(); 
     //add all of them 
     shapeBuilderList.add(circle); 
    } 
}