2010-04-21 11 views
7

Jestem również początkującym użytkownikiem języka Java i IoC. Jak zrobić rzeczy:Problem IoC z multi bindingiem


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

w sposób IoC na przykładzie 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??
    }
}

Jak skonfigurować wtryskiwacz?


@Override 
protected void configure() { 

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

Odpowiedz

4

mam zamiar założyć, że var jest kod, który jest określony w czasie wykonywania na podstawie danych wprowadzanych przez użytkownika, itp i jednej instancji Foo musi być w stanie powrócić różne implementacje Bar że w zależności od kod (jest to fabryka dynamiczna Bar).

W takim przypadku prawdopodobnie chcesz użyć numeru MapBinder z rozszerzenia Multibinding.

Można by pewnie zrobić coś takiego:

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 

Następnie Foo może wyglądać tak:

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

Dziękuję bardzo. To było dokładnie tak, jak to załatwiłeś. Dzięki tobie zrozumiałem nareszcie Provider i MapBinder :) – kospiotr