1

私は 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はどのように見えますか?

ありがとう !

4

1 に答える 1

0

リクエストごとに Manager が作成されている場合は、カスタム プロバイダーを使用してこれを実現できます。

注入可能な場合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);
于 2016-03-12T18:37:35.737 に答える