2013-01-07 12 views
7

Mam trzy klasy CircleBuilder, SquareBuilder i TriangleBuilder implementujące interfejs ShapeBuilder.Jaki jest najlepszy sposób wstrzyknięcia listy w google-guice?

Muszę zainicjować mój FormBuilder, a zwłaszcza BuilderList (rozszerzając List<ShapeBuilder>) o jedno wystąpienie każdej klasy za pomocą google-guice.

Jaki jest najlepszy sposób?

wiem na temat metod dostawcy i rzeczy tak:

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

ale oznaczałoby to, że trzeba utworzyć mój FormBuilder ręcznie, co pokonał cel przy użyciu Guice (bo FormBuilder jest górny element w moim obiektowy wykres).

Chciałbym móc napisać coś takiego:

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

jakiś pomysł?

Odpowiedz

9

Zastanów się, Multibindings, które będą zbierać powiązania bardzo podobne do fragmentu kodu. W Multibinderze nie ma możliwości tworzenia list, ponieważ Multibinder jest przeznaczony do powiązania z tą samą kolekcją w wielu modułach, a kolejność elementów listy Multibindera zależy od kolejności, w jakiej oceniane są Twoje Moduły.

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

Alternatywnie your @Provides method może wziąć w parametrach (np CircleBuilder lub Provider<CircleBuilder>), dzięki czemu można mieć Guice stworzyć wszystko z wyjątkiem samej listy. Guice nie tylko będzie automatycznie wiązał Dostawców wszystkich powiązanych typów, ale będzie również wprowadzał każdy parametr w dowolnej metodzie w metodzie @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()); 
} 
+3

Uwaga: MultiBinding wymaga innego jar -> Guice-multibindings-3.0.jar –

0

Możemy zrobić coś takiego: -

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

W swojej FormBuilder klasy: -

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); 
    } 
} 
Powiązane problemy