У меня есть приложение Swing, которое я хотел бы преобразовать от спагетти до использования внедрения зависимости с Guice. Используя Guice для предоставления услуг как конфигурация и очередей задачи идет большой, но я теперь запускаю на GUI приложения и не уверен в том, как продолжить двигаться.
Приложение в основном a JFrame
с набором вкладок в a JTabbedPane
. Каждая из вкладок является отдельным JPanel
подкласс, который размечает различные компоненты и нуждается в сервисах для выполнения действий, когда определенные кнопки нажимаются.
В текущем приложении это несколько походит на это:
@Inject
public MainFrame(SomeService service, Executor ex, Configuration config) {
tabsPane = new JTabbedPane();
// Create the panels for each tab and add them to the tabbedpane
somePanel = new SomeTabPanel(service, ex, config);
tabsPane.addTab("Panel 1", somePanel);
someOtherPanel = new SomeOtherTabPanel(service, ex, config);
tabsPane.addTab("Panel 2", someOtherPanel);
... do more stuff
}
Очевидно, это точно не применяет лучшие методы DI. Я не хочу иметь к @Inject
вкладки, потому что это получило бы меня конструктор с десятками параметров. Я действительно хочу использовать Guice для введения необходимых зависимостей в любые объекты вкладки, в которых я нуждаюсь без меня имеющий необходимость передать все те зависимости конструкторам вкладки.
Все зависимости для объектов вкладки являются сервисами что мой Module
знает о, так в основном все, что я думаю, что хочу сделать, должен попросить Guice требуемые объекты и создавать их для меня.
Не могли бы вы использовать Multibinding для привязки всех ваших вкладок как Set
? Если они реализовали какой-то интерфейс, который позволил вам получить имя для использования для вкладки, вы могли бы просто добавить вкладки из набора в цикле. Вам, вероятно, нужно что-то выяснить, что касается порядка вкладок.
Не могли бы вы просто внедрить службу в JFrame и позволить вкладкам запрашивать службу / конфигурацию, вот так
this.getTopLevelAncestor().getService()
Конечно, это только работает если вызывается после того, как они были добавлены в контейнер.