Guice - Как позволить нескольким нескольким модулям внести вклад в одну вещь? - PullRequest
1 голос
/ 20 июня 2019

Я хотел бы знать, возможно ли позволить модулям создавать определенную привязку, а затем внедрить комбинацию этих привязок.

Простой пример: у меня есть List<SomeType>, который должен быть введен, и несколькомодули должны иметь возможность добавлять / связывать элементы в этот список.В основном используются привязки (или, если уж на то пошло, многократные привязки) к различным модулям.Как я могу достичь этого и какой подход будет наилучшим?Ничего не могу придумать.

1 Ответ

1 голос
/ 20 июня 2019

Используйте расширение Multibinder

Но ... вам придется использовать Set, а не List.

Кроме того, перед запуском обратите внимание, что, хотя Multibinder является расширением, он уже интегрирован в основной артефакт Guice уже в нескольких выпусках.

Создайте общий статический метод, подобный этому:

public static LinkedBindingBuilder<SomeType> bindSomeTypeSetElement(Binder binder) {
  return Multibinder.newSetBinder(binder, SomeType.class).addBinding();
}

Я говорю вам написать такой метод, потому что потом будет легче найти определение привязки, а если вы захотите изменить SomeType на OtherType, это будет легче сделать одним методом. Наконец, если вы хотите изменить привязку (например, использовать аннотацию для идентификации), это также проще.

Теперь в модулях, которые вы хотите связать, просто напишите следующий код в ваших configure методах:

import static path.to.SomeTypeBinder.bindSomeTypeSetElement;

public void configure() {
  bindSomeTypeSetElement(binder()).toInstance(new ConcreteType());
  bindSomeTypeSetElement(binder()).to(SecondConcreteType.class);
  bindSomeTypeSetElement(binder()).toProvider(new ThirdConcreteTypeProvider());
}
...