Obecnie eksperymentuję z inwersją GUice kontenera sterowania. Poprzednio miałem single dla jakiejkolwiek usługi (bazy danych, aktywnego katalogu), z której korzystałem. Teraz refaktoryzowałem kod: wszystkie zależności są podawane jako parametry dla konstruktorów. Jak na razie dobrze. Teraz najtrudniejszą częścią jest graficzny interfejs użytkownika. Spotykam się z tym problemem: mam tabelę (JTable) produktów owiniętych w ProductFrame. Podaję zależności jako parametry (EditProductDialog).Czy iniekcja zależności dotyczy tylko obiektów typu usługi i pojedynczych obiektów? (a NIE dla GUI?)
@Inject
public ProductFrame(EditProductDialog editProductDialog) {
// ...
}
// ...
@Inject
public EditProductDialog(DBProductController productController, Product product) {
// ...
}
Problemem jest to, że Guice nie może wiedzieć, jaki produkt wybrałem w tabeli, więc nie może wiedzieć, co wstrzykiwać w EditProductDialog.
Wstrzykiwanie zależności jest dość wirusowe (jeśli zmodyfikuję jedną klasę, aby użyć wstrzyknięcia zależności, muszę również zmodyfikować wszystkie inne klasy, z którymi wchodzi w interakcje), więc moje pytanie brzmi: czy powinienem bezpośrednio utworzyć instancję EditProductDialog? Ale wtedy musiałbym ręcznie przekazać DBProductController do EditProductDialog i będę również musiał przekazać go do ProductFrame, a wszystko to sprowadza się do tego, aby w ogóle nie używać iniekcji zależności.
Czy mój projekt jest wadliwy i z tego powodu nie mogę tak naprawdę zaadaptować projektu do iniekcji dependecy?
Podaj mi kilka przykładów wykorzystania wtrysku zależności w graficznym interfejsie użytkownika. Wszystkie przykłady znalezione w Internecie są naprawdę prostymi przykładami korzystania z niektórych usług (głównie baz danych) z zastrzykiem zależności.
Myślałem o tym samym rozwiązaniu, ale nie byłem pewien, czy jest to najlepsze podejście, ponieważ przy wstrzyknięciu zależności "musisz zadeklarować swoje zależności" (w konstruktorze w przypadku guice). Ale teraz wydaje się to najlepszym rozwiązaniem. Dzięki za linki. Są zdecydowanie pomocni !!! –
Innym podejściem, o którym myślałem było użycie guice tylko dla usług (baza danych itp.) I dla klas gui, aby przekazać wtryskiwacz jako parametr. Nie jestem też pewien tego podejścia. –
Nie rób tego! Bezpośrednie użycie Guice Injector w kodzie aplikacji musi być uważane za zapach projektu, jest to sprzeczne z "Inversion of Control" i wygląda jak "wzór fabryczny". Tylko ramy lub biblioteki mogą mieć taką potrzebę i tylko w rzadkich przypadkach. – jfpoilpret