Опциональная инъекция в Guice

Можно ли сказать Guice, что нет необходимости вводить все аргументы конструктора? Например, у меня есть конструктор Foo это занимает два аргумента типов Bar а также Baz, Все они не являются обязательными в моей системе: они могут

  1. оба присутствуют
  2. оба отсутствуют
  3. только Bar подарок
  4. только Baz подарок.

Тем не менее, это зависит от других модулей, обеспечивающих эти привязки. Я хочу получить что-то вроде этого:

class Foo {
  private final Bar bar;
  private final Baz baz;

  @Inject(optional = true)
  public Foo(@Nullable Bar bar, @Nullable Baz baz) {
    this.bar = bar;
    this.baz = baz;
  }
}

Но я не могу по-настоящему использовать optional с конструкторами. Есть способ сделать это?

2 ответа

Решение

Я думаю, что предпочтительным шаблоном Guice для этого является:

public class HolderPatter {

  static class Bar {
    @Inject Bar(BarDependency dependency) {}
  }
  static class Baz {
    @Inject Baz(BazDependency dependency) {}
  }

  static class BarHolder {
    @Inject(optional=true) Bar value = null;
  }

  static class BazHolder {
    @Inject(optional=true) Baz value = null;
  }

  static class Foo {
    private final Bar bar;
    private final Baz baz;

    @Inject
    public Foo(BarHolder bar, BazHolder baz) {
      this.bar = bar.value;
      this.baz = baz.value;
    }
  }
}

Обратите внимание, что это также позволит вам указать вменяемые значения по умолчанию...

Последняя версия Guice недавно добавлена OptionalBinderкоторый работает лучше, чем@Inject(optional=true)метод, а также добавляет несколько дополнительных функций.

Смотрите также тему гдеOptionalBinder было объявлено.

Другие вопросы по тегам