我是 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>}
在 Guice 示例中以 IoC 方式?
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>}
我应该如何配置我的注入(inject)器?
@Override
protected void configure() {
<ul>bind(Bar.class).to(BarImpl.class);<br/>//and what else??</ul>}
最佳答案
我假设 var
是在运行时根据数据、用户输入等确定的代码,并且 Foo
的单个实例必须是能够根据该代码返回 Bar
的不同实现(这是一个动态的 Bar
工厂)。
在那种情况下,您可能想要做的是使用 MapBinder来自多重绑定(bind)扩展。
你可能会这样做:
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();
}
}
关于java - 多重绑定(bind)的 IoC 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684189/