2010-04-21 5 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
      }
    }
}

в примере IoC на примере 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??
    }
}

Как настроить мой инжектор?


@Override 
protected void configure() { 

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

ответ

4

Я буду считать, что var представляет собой код, который определяется во время выполнения на основе данных, вводимых пользователем, и т.д., и один экземпляр Foo должен иметь возможность вернуться различных реализаций Bar в зависимости от того, что код (это динамический завод Bar).

В этом случае вы, возможно, захотите использовать MapBinder из расширения Multibinding.

Вы, вероятно, сделать что-то вроде этого:

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

Большое спасибо. Это было именно то, как ты всасывал. Благодаря вам я понял Поставщика и MapBinder наконец :) – kospiotr