Как использовать Guice в приложении Swing - PullRequest
7 голосов
/ 13 апреля 2010

У меня есть приложение Swing, которое я хотел бы преобразовать из спагетти в использование инъекций зависимостей в Guice. Использование Guice для предоставления сервисов, таких как конфигурация и очереди задач, работает отлично, но сейчас я начинаю работать с графическим интерфейсом приложения и не знаю, что делать дальше.

Приложение в основном JFrame с кучей вкладок в 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 необходимые объекты и сконструировать их для меня. ,

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

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

0 голосов
/ 13 апреля 2010

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

this.getTopLevelAncestor().getService()

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

...