Google Guice и различные инъекции во время выполнения - PullRequest
0 голосов
/ 04 октября 2011

Я бы хотел изменить внедренные реализации на основе чего-то, что не было известно до времени выполнения.В частности, я бы хотел, чтобы мое приложение работало в разных версиях, где «версия» не определяется до тех пор, пока не будет выполнен запрос.Кроме того, «версия» может варьироваться в зависимости от запроса.

После прочтения документации кажется, что я мог бы реализовать поставщиков в тех случаях, когда мне нужно выбрать реализацию во время выполнения на основе «версии».Кроме того, я мог бы накатить свой сок на сок.

Является ли реализация провайдера лучшим способом в этом сценарии?Я хотел бы знать, есть ли лучшая практика или кто-то еще пытался использовать Guice для решения этой проблемы.

Спасибо за любую помощь!

-Joe

Ответы [ 2 ]

0 голосов
/ 23 января 2015
public class MyRuntimeServiceModule extends AbstractModule {
  private final String runTimeOption;

  public ServiceModule(String runTimeOption) {
    this.runTimeOption = runTimeOption;
  }

  @Override protected void configure() {

    Class<? extends Service> serviceType = option.equals("aServiceType") ?
        AServiceImplementation.class : AnotherServiceImplementation.class;
    bind(Service.class).to(serviceType);
  }
}

  public static void main(String[] args) {
  String option = args[0];
  Injector injector = Guice.createInjector(new MyRuntimeServiceModule(option));

}
0 голосов
/ 05 октября 2011

Я думаю, что если версия может быть известна только во время выполнения, вы должны предоставить версионные «сервисы» вручную с помощью специального провайдера. Возможно что-то вроде этого:

@Singleton
public abstract class VersionedProvider<T, V> {

    private Map<V, T> objects;

    T get(V version) {
        if (!objects.containsKey(version)) {
            objects.put(version, generateVersioned(version));
        }
        return objects.get(version);
    }

    // Here everything must be done manually or use some injected
    // implementations
    public abstract T generateVersioned(V version);
}
...