Google Guice: правильный способ внедрить примитивную структуру данных - PullRequest
1 голос
/ 24 июня 2019
private HashSet<WorkWindow> childWorkWindows;

@Inject
public CompositeWorkWindows (
        HashSet childWorkWindows
) {
    this.childWorkWindows = childWorkWindows;
}

Знает ли Guice, как автоматически вводить это, не указывая ничего в модуле?

Меня беспокоит то, что я указываю тип для HashSet в закрытом поле.

1 Ответ

3 голосов
/ 24 июня 2019

Вы должны сначала связать это

В вашей конфигурации:

@Provides HashSet<WorkWindow> provideChildWorkWindows() {
  // Create and return your HashSet<WorkWindow>
}

Тогда только оно будет введено в ваш CompositeWorkWindows.

Если вы хотите связать несколько независимых WorkWindow, используйте мультисвязывание Guice. Но в этом случае вы должны использовать интерфейс Set в качестве получателя вместо реализации HashSet, потому что Guice предоставит Set, но не HashSet. Обратите внимание, что мультисвязывание позволяет вам иметь определения элементов в разных модулях.

In MyModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().toInstance(new MyWorkWindow());

In OtherModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().to(OtherWorkWindow.class);

В FinalModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().toProvider(new FinalWorkWindowProvider());

Если в инжекторе присутствуют все модули, вы получите Set размером 3, содержащий три различных WorkWindow, которые вы создали.

...