Guice:在运行时有条件地实例化一个接口(在众多中)的具体实现

时间:2016-03-12 01:30:15

标签: guice guice-3

我对Guice很新,一直试图看看我的问题是否可以与Guice解决。我有一个主要的Driver类,看起来像这样:

public class Driver{
  execute(){
    Manager m = injector.getInstance(Manager.class);
  }
}

public class Manager{

  private List<IExecutor> executors;

  @Inject
  public Manager(IExecutorWrapper executor){
    this.executors = executor.getExecutors();
  }

  public List<IExecutor> getExecutors() {
    return executors;
  }

}

我的IExecutorWrapper类有多个实现,每个实现都有自己的IExecutors列表。在运行时只选择1, 选择哪种实现取决于上下文的逻辑。什么是最好的设计方法,这样我的Driver类 不需要改变?我的GuiceModule将如何?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果为每个请求创建了管理器,则可以使用自定义提供程序来实现此目的。

如果Context是可注射的(可能是请求范围的服务):

@Provides
IExecutorWrapper createIExecutorWrapper(Context context) {
  if (context.isXX()) {
    return new Executor1();
  } else {
    return new Executor2();
  }
}

如果IiceecutorWrapper的实现应该由Guice注入,那么你可以注释每个实现类型,并注入提供者:

@Provides
IExecutorWrapper createIExecutorWrapper(Context context, 
       @Type1 Provider<IExecturoWrapper> type1, 
       @Type2 Provider<IExecutorWrapper> type2) {
  if (context.isXXX()) {
    return type1.get();
  } else {
    return type2.get();
  }
}

和配置:

bind(IExecutorWrapper.class).annotatedWith(Type1.class).to(Executor1.class);
bind(IExecutorWrapper.class).annotatedWith(Type2.class).to(Executor2.class);