Ho un'applicazione Swing che vorrei convertire da spaghetti a usando l'iniezione delle dipendenze con Guice. Usare Guice per fornire servizi come la configurazione e le code delle attività sta andando alla grande, ma ora sto iniziando dalla GUI dell'app e non sono sicuro di come procedere.Come utilizzare Guice nell'applicazione Swing
L'applicazione è fondamentalmente un JFrame
con un gruppo di schede in un JTabbedPane
. Ciascuna scheda è una sottoclasse separata JPanel
che espone i vari componenti e richiede servizi per eseguire azioni quando vengono premuti determinati pulsanti.
Nell'applicazione attuale, questo sembra un po 'come questo:
@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
}
Ovviamente, questo non esattamente seguire DI migliori pratiche. Non voglio avere le schede @Inject
perché questo mi porterebbe un costruttore con dozzine di parametri. Voglio usare Guice per iniettare le dipendenze richieste in qualunque oggetto tab di cui ho bisogno senza che io debba passare tutte queste dipendenze ai costruttori di tabulazioni.
tutte le dipendenze per gli oggetti scheda sono servizi che la mia Module
conosce, in modo sostanzialmente tutto quello che penso che voglio fare è chiedere Guice per gli oggetti necessari e li hanno costruiti per me.
Si consiglia di dare un'occhiata al progetto Guts-GUI (che possiedo); questo è un framework basato su Guice per scrivere applicazioni Swing. Sebbene non sia ancora stato rilasciato ufficialmente, al momento è abbastanza praticabile. L'URL è: http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret
L'ho esaminato brevemente ma sembra che ciò comporterebbe una completa riscrittura dell'applicazione. Ad esempio, ho già un potente sistema di esecuzione delle attività e un bus degli eventi. L'applicazione non è grande (circa 20kloc), ma comunque abbastanza grande da non considerare l'avvio. –