2013-01-07 20 views
7

Ho tre classi CircleBuilder, SquareBuilder e TriangleBuilder che implementano l'interfaccia ShapeBuilder.Qual è il modo migliore per iniettare una lista con google-guice?

Ho bisogno di inizializzare il mio FormBuilder e in particolare un BuilderList (estendendo List<ShapeBuilder>) con un'istanza di ogni classe con google-guice.

Qual è il modo migliore?

so circa i metodi di provider e cose di questo tipo:

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

ma vorrebbe dire che devo creare il mio FormBuilder manualmente che sconfigge lo scopo di utilizzare Guice (perché FormBuilder è l'elemento superiore nel mio grafico dell'oggetto).

Mi piacerebbe essere in grado di scrivere qualcosa del genere:

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

Qualche idea?

risposta

9

Considerare Multibindings, che raccoglierà i binding molto simile allo snippet di codice. Non vi è alcuna disposizione per gli elenchi tramite Multibinder, poiché Multibinder è progettato per l'associazione alla stessa raccolta in più moduli e l'ordine degli elementi di un elenco Multibinder dipenderà dall'ordine in cui sono stati valutati i moduli.

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

In alternativa, your @Provides method può prendere nei parametri (ad esempio CircleBuilder o Provider<CircleBuilder>) in modo da poter avere Guice creare tutto tranne la lista stessa. Guice non solo vincerà automaticamente i provider di tutti i tipi associati, ma inietterà anche tutti i parametri in qualsiasi metodo @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

Nota: MultiBinding richiede un altro vaso -> Guice-multibindings-3.0.jar –

0

Possiamo fare qualcosa di simile: -

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

nella classe FormBuilder: -

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); 
    } 
} 
Problemi correlati