2010-04-13 9 views
7

Mam aplikację Swing, którą chciałabym przekonwertować ze spaghetti na iniekcję zależności z Guice. Używanie Guice do świadczenia usług takich jak konfiguracja i kolejki zadań idzie świetnie, ale teraz zaczynam od interfejsu GUI aplikacji i nie jestem pewien, jak postępować.Jak używać aplikacji Guice in Swing

Aplikacja jest w zasadzie JFrame z wieloma zakładkami w JTabbedPane. Każda z zakładek jest osobną podklasą JPanel, która określa różne komponenty i usługi wymagające wykonywania czynności po naciśnięciu niektórych przycisków.

W bieżącej aplikacji, wygląda to mniej więcej tak:

@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 
} 

Oczywiście, to nie jest dokładnie śledzić DI najlepszych praktyk. Nie chcę mieć do @Inject kart, ponieważ to dałoby mi konstruktora z dziesiątkami parametrów. Chcę użyć Guice do wstrzyknięcia wymaganych zależności w dowolne obiekty tabulacji, których potrzebuję, bez konieczności przesyłania wszystkich tych zależności do konstruktorów kart.

Wszystkie zależnościach dla obiektów karcie są usługi, które moja Module wie o, więc w zasadzie wszystko myślę chcę zrobić, to poprosić Guice dla wymaganych przedmiotów i ich skonstruowane dla mnie.

+0

Możesz rzucić okiem na projekt Guts-GUI (który mam); jest to oparte na Guice środowisko do pisania aplikacji Swing. Choć oficjalnie jeszcze nie wydany, jest obecnie całkiem sprawny. URL to: http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret

+0

Spojrzałem na to krótko, ale wygląda na to, że pociągnie za sobą całkowitą przeróbkę aplikacji. Mam już na przykład bardzo potężny system wykonywania zadań i szyny zdarzeń. Aplikacja nie jest duża (około 20kloc), ale wciąż wystarczająco duża, aby nie brać pod uwagę rozpoczęcia od nowa. –

Odpowiedz

3

Czy możesz użyć Multibinding, aby powiązać wszystkie swoje karty jako Set? Jeśli zaimplementowali interfejs, który pozwolił ci uzyskać nazwę do użycia dla karty, możesz po prostu przepuścić przez dodanie kart z zestawu. Prawdopodobnie musisz wymyślić coś na temat zamówienia kart.

+0

Możliwość, którą rozważę. Wierzyłem, że Multibinding jest tylko w przypadkach, w których nie znasz ilości przedmiotów, które otrzymasz, lub ich rzeczywistych typów. W tym przypadku wiem dokładnie, ile i jakie typy, po prostu nie chcę ich konstruować ręcznie, więc nie sądziłem, że Multibinding jest wystarczająco dobrym dopasowaniem do tego, co chciałem zrobić. –

+0

Zgadzam się z @ColinD. +1 dla multibindingu – gpampara

0

nie można po prostu wprowadzić usługę w JFrame i niech wypustki zapytać o usługi/konfiguracji, tak jak

this.getTopLevelAncestor().getService() 

Oczywiście to działa tylko jeśli po ich nazwie, które zostały dodane do kontenera .

+2

Myślę, że to sprawi, że spaghetti będzie jeszcze gorsze. Dodałoby to wiele rzutów do 'MainFrame' i faktycznie zmniejszyło potencjał do ponownego wykorzystania dowolnej z tych klas, ponieważ byłyby one ściśle powiązane z' MainFrame', zamiast tylko ich zależności, jak teraz. –