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

Guice : conditionally instantiate 1 concrete implementation of an interface (among many) at runtime

我是 Guice 的新手,一直在尝试看看我的问题是否可以用 Guice 解决。我有一个主驱动程序 class,看起来像这样:

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 class 有多个实现,每个实现都有自己的 IExecutors 列表。在运行时只选择 1, 选择哪个实现的逻辑取决于上下文。什么是最好的设计方法,使我的驱动程序 class 不需要改变?我的 GuiceModule 会是什么样子?

谢谢!

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

如果 Context 是可注入的(并且可能是请求范围内的服务):

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

如果 IExecutorWrapper 的实现应该由 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);