2010-04-21 5 views
7

Ich bin Java Anfänger und IoC auch. Wie man Sachen macht:IoC-Problem mit Multi-Bindung


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 IoC Weg auf Guice Beispiel?


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??
    }
}

Wie soll ich meinen Injektor konfigurieren?


@Override 
protected void configure() { 

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

Antwort

4

ich, dass var zu übernehmen werde ein Code, der auf Daten, Benutzereingaben, usw. und eine einzige Instanz von Foo zur Laufzeit der Lage sein, auf Basis bestimmt wird, muss verschiedene Implementierungen von Bar je nach der Rückkehr Code (es ist eine dynamische Bar Fabrik).

In diesem Fall, was Sie wahrscheinlich tun möchten, verwenden Sie MapBinder von der Multibinderweiterung.

Sie würden wahrscheinlich so etwas wie dies tun:

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 

Dann Foo könnte wie folgt aussehen:

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

Ihnen sehr danken. Es war genau so, wie du dich hingelegt hast. Dank dir habe ich Provider und MapBinder endlich verstanden :) – kospiotr