Интерфейс Google и различные инъекции во время выполнения

#dependency-injection #guice

#внедрение зависимостей #графический интерфейс

Вопрос:

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

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

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

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

-Джо

Комментарии:

1. Как вы планируете реализовать информацию о «версии»? Параметры метода? Аннотации?

Ответ №1:

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

 @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);
}
  

Ответ №2:

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

}