установка условного модуля - PullRequest
2 голосов
/ 22 мая 2019

У меня есть код ниже в основном классе

public ABCImpl() {
    Injector injector = Guice.createInjector(new SomeModule());
    this.config = injector.getInstance(SomeConfig.class);

В SomeModule установлены другие модули, например

public class SomeModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new SomeOtherModule());
        install(new AndAnotherModule());
    }
}

Модуль SomeOtherModule принадлежит к другому файлу и имеет реализацию провайдера.

@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ getXYZ() {
    return new XYZ();
}

Теперь я хочу переопределить это значение по умолчанию внутри SomeModule или создать другой модуль для установки на основе значений в конфигурации

@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ getXYZDifferentWay() {
    return new XYZ(someparam);
}

Как этого добиться.Моя единственная цель - если какое-то значение в config равно true, тогда я должен получить другой XYZ, иначе все останется как есть.Это может быть полезно в тех случаях, когда вам нужно соединение с ресурсом по умолчанию, но на локальном компьютере я могу использовать фиктивный ресурс.

1 Ответ

1 голос
/ 22 мая 2019

Буквально просто установите их условно:

if (condition) {
  install(new SomeOtherModule());
} else {
  install(new AndAnotherModule());
}

Или, если вы хотите AndAnotherModule переопределить привязки в SomeOtherModule, используйте Modules.override:

Module module = new SomeOtherModule();
if (condition) {
  module = Modules.override(module).with(new AndAnotherModule());
}
install(module);

Или, если вы хотите использовать конфигурацию из другой привязки:

// In SomeOtherModule
@Provides @FromSomeOtherModule
public XYZ getXYZ() { ... }

// In AndAnotherModule
@Provides @FromAndAnotherModule
public XYZ getXYZ() { ... }

// In a module which "picks" between the two:
@ProvidesIntoOptional(ProvidesIntoOptional.Type.DEFAULT)
public XYZ provideBasedOnCondition(
    @SomeQualifier boolean condition,
    @FromSomeOtherModule XYZ fromSomeOtherModule,
    @FromAndAnotherModule XYZ fromAndOtherModule) {
  return condition ? fromSomeOtherModule : fromAndOtherModule;
}

, где @FromSomeOtherModule, @FromAndAnotherModule и @SomeQualifier - подходящие аннотации привязки.

...