2010-04-21 26 views
7

我也是Java初學者和IoC。如何做東西:具有多重綁定的IoC問題


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 way on Guice example?


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

我應該如何配置我的注射器?


@Override 
protected void configure() { 

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

回答

4

我要去假設var是在基於數據,用戶輸入等以及Foo單個實例運行時所確定的代碼必須能夠取決於的Bar返回不同的實現代碼(這是一個動態的Bar工廠)。

在這種情況下,您可能想要做的是使用Multibinding擴展中的MapBinder

你可能會做這樣的事:

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 

然後Foo可能看起來像:

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

非常感謝你。這正是你如何猜測的。感謝你,我終於明白了Provider和MapBinder :) – kospiotr 2010-04-21 17:25:49