Guice/Gin. Как внедрить несколько реализаций

У меня есть веб-приложение, которое использует GIN для инъекции зависимостей в точке входа.

private InjectorService injector = GWT.create(InjectorService.class);

@GinModules({PlaceContollerInject.class, RootViewInject.class})
public interface InjectorService extends Ginjector {

  RootView getRootView();
  PlaceController getPlaceConroller();

}

public class RootViewInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).to(RootViewImpl.class);
  }
}

Мне нужна мобильная версия, которая использует другую реализацию RootView. Зависимости описаны в следующем модуле

public class RootViewMobileInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).to(RootViewMobileImpl.class);
  }
}

Вопрос в том, как выбрать необходимую зависимость условно, нужна ли нам мобильная или стандартная версия. Я видел GWT-GIN Multiple Implementations, но не нашел такого решения, потому что Provider разрывает цепочку зависимостей, а Factory Pattern нарушает тестируемость. В видео "Big Modular Java with Guice" здесь (12 минут) инжектор Guice с модулями был представлен как замена фабрикам. Итак, мой вопрос в том, должен ли я создавать разные Ginjector для мобильной и стандартной версий (как MobileFactory и DefaultFactory) моего приложения или это плохая практика и я должен настроить один экземпляр Ginjector со всеми необходимыми версиями. Например, с привязкой аннотаций следующим образом.

public class RootViewMobileInject extends AbstractGinModule {

  @Override
  protected void configure() {
    bind(RootView.class).annotatedWith(Mobile.class).to(RootViewMobileImpl.class);
  }
}

и использовать аннотированные @Mobile привязки в точке входа GWT

  @Inject
  private void setMobileRootView(@Mobile RootView rw) {
    this.rw = rw;
  }

В таком упрощенном примере, как выше, это может быть возможно. Но если приложение имеет больше зависимостей, которым нужны мобильные и дефолтные версии. Это похоже на возврат к нетестируемым "уродливым" (как было сказано на презентации Guice) фабрикам. Извините за мой английский. Любая помощь будет принята с благодарностью.

7
задан Community 23 May 2017 в 12:15
поделиться