java - 多重绑定(bind)的 IoC 问题

标签 java inversion-of-control guice

我是 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/

相关文章:

java - 0.99999999999相乘时可以四舍五入到1.0吗?

c# - 在不创建实现的情况下实现接口(interface)(动态代理?)

c# - 如何将 AutoMapper 与 Ninject.Web.Mvc 一起使用?

c# - 使用 Autofac WcfIntegration 时如何处理构造函数异常

java - 将工厂模式转换为 Guice 模块

java - 我们如何找出 while 循环持续的次数

java - 更改 HEAD 请求的 Jersey 默认值

java - Dropwizard 0.8 和 GuiceBundle Governator : Forcing Resources class to be Singleton

java - 使用 Shiro 登录后,主题不再在 session 中进行身份验证

java - 如何循环打印多个 JSch session 的输出?