Как использовать Guice в приложении Swing

У меня есть приложение 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 требуемые объекты и создавать их для меня.

7
задан Gerco Dries 13 April 2010 в 18:17
поделиться

2 ответа

Не могли бы вы использовать Multibinding для привязки всех ваших вкладок как Set ? Если они реализовали какой-то интерфейс, который позволил вам получить имя для использования для вкладки, вы могли бы просто добавить вкладки из набора в цикле. Вам, вероятно, нужно что-то выяснить, что касается порядка вкладок.

3
ответ дан 7 December 2019 в 16:40
поделиться

Не могли бы вы просто внедрить службу в JFrame и позволить вкладкам запрашивать службу / конфигурацию, вот так

this.getTopLevelAncestor().getService()

Конечно, это только работает если вызывается после того, как они были добавлены в контейнер.

0
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: