Проблема IoC с мульти-связыванием - PullRequest
7 голосов
/ 21 апреля 2010

Я новичок в Java и IoC. Как делать вещи:


public class Foo{

<ul>//private Bar bar; //Bar is an interface
private int var;

public Foo(){
}

public void setVar(int var){
<ul>this.var = var;</ul>}

public Bar getBar(){
<ul>if(var==1){
<ul>return new BarImpl1(); //an implemantation of Bar interface
</ul>}</ul>
<ul>else if(var==2){
<ul>return new BarImpl2(); //an implemantation of Bar interface
</ul>}</ul>
<ul>else{
<ul>return new BarImpl(); //an implemantation of Bar interface
</ul>}</ul>
}</ul>}

способом IoC на примере Guice?


public class Foo{

<ul>private Bar bar; //Bar is an interface
private int var;

@Inject
public Foo(Bar bar){
<ul>this.bar = bar;</ul>}

public void setVar(int var){
<ul>this.var = var;</ul>}

public Bar getBar(){
<ul>return bar; // or what else??</ul>
}</ul>}

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


@Override 
protected void configure() {
<ul>bind(Bar.class).to(BarImpl.class);<br>//and what else??</ul>}

1 Ответ

4 голосов
/ 21 апреля 2010

Я собираюсь предположить, что 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();
   }
}
...