2010-04-21 12 views
7

Je suis Java débutant et IoC ainsi. Comment faire des choses:IoC problème avec multi liaison


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

de manière IoC sur Guice exemple?


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

Comment dois-je configurer mon injecteur?


@Override 
protected void configure() { 

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

Répondre

4

Je vais supposer que var est un code qui est déterminé lors de l'exécution en fonction des données, l'entrée d'utilisateur, etc., et une seule instance de Foo doit être en mesure de retourner les différentes implémentations de Bar selon que code (c'est une usine Bar dynamique).

Dans ce cas, ce que vous voulez probablement faire est d'utiliser MapBinder de l'extension Multibinding.

Vous auriez probablement faire quelque chose comme ceci:

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 

Alors Foo pourrait ressembler à:

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

Merci beaucoup. C'était exactement comment tu as assumé. Grâce à vous j'ai compris Provider et MapBinder enfin :) – kospiotr