2010-04-21 15 views
7

Sono un principiante Java e IoC. Come fare cose:Problema IoC con rilegatura multipla


public class Foo{ 


          
  
    //private Bar bar; //Bar is an interface private int var; public Foo(){ } public void setVar(int var){
      this.var = var;
    } public Bar getBar(){
      if(var==1){
        return new BarImpl1(); //an implemantation of Bar interface
      }
      else if(var==2){
        return new BarImpl2(); //an implemantation of Bar interface
      }
      else{
        return new BarImpl(); //an implemantation of Bar interface
      }
    }
}

in modo IoC su esempio Guice?


public class Foo{ 


          
  
    private Bar bar; //Bar is an interface private int var; @Inject public Foo(Bar bar){
      this.bar = bar;
    } public void setVar(int var){
      this.var = var;
    } public Bar getBar(){
      return bar; // or what else??
    }
}

Come devo configurare il mio iniettore?


@Override 
protected void configure() { 

          
  
    bind(Bar.class).to(BarImpl.class);
    //and what else??
}

risposta

4

sto andando supporre che var è un codice che viene determinato in fase di esecuzione, sulla base dei dati di input dell'utente, ecc e una singola istanza di Foo deve essere in grado di restituire diverse implementazioni di Bar seconda che codice (è una fabbrica dinamica Bar).

In tal caso, ciò che probabilmente si vuole fare è usare MapBinder dall'estensione Multibinding.

si sarebbe probabilmente fare qualcosa di simile:

MapBinder<Integer, Bar> mapbinder 
    = MapBinder.newMapBinder(binder(), Integer.class, Bar.class); 
mapbinder.addBinding(1).to(BarImpl1.class); 
mapbinder.addBinding(2).to(BarImpl2.class); 

bind(Bar.class).to(BarImpl.class); // the fallback 

Poi Foo potrebbe essere simile:

public class Foo { 
    private final Provider<Bar> defaultProvider; 
    private final Map<Integer, Provider<Bar>> barTypeMap; 

    private int var = -1; 

    @Inject public Foo(Provider<Bar> defaultProvider, 
         Map<Integer, Provider<Bar>> barTypeMap) { 
    this.defaultProvider = defaultProvider; 
    this.barTypeMap = barTypeMap; 
    } 

    public void setVar(int var) { ... } 

    public Bar getBar() { 
    if(barTypeMap.containsKey(var)) { 
     return barTypeMap.get(var).get(); 
    } 

    return defaultProvider.get(); 
    } 
} 
+0

La ringrazio molto. E 'stato esattamente come hai riassunto. Grazie a te ho capito Provider e MapBinder finalmente :) – kospiotr