【问题标题】:Guice : conditionally instantiate 1 concrete implementation of an interface (among many) at runtimeGuice:在运行时有条件地实例化一个接口的具体实现(在许多接口中)
【发布时间】:2016-03-12 01:30:15
【问题描述】:

我对 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 类有多个实现,每个实现都有自己的 IExecutor 列表。运行时只选择 1, 选择哪种实现的逻辑取决于上下文。设计这个的最好方法是什么,这样我的 Driver 类 不需要改变吗?我的 GuiceModule 会是什么样子?

谢谢!

【问题讨论】:

  • 选择“IExecutorWrapper”的逻辑是什么?
  • 如果 ctx.contains("a") 然后选择 1 否则选择另一个。
  • 你应该更具体。你的背景是什么?它从何而来?谁创建/更新它?
  • 上下文更像是用户输入。它是由用户创建的,是您在运行时获得的,并且对于每个请求都不同

标签: guice guice-3


【解决方案1】:

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

如果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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多