Oto mój problem:Custom Guice Scope, czy lepsze podejście?
Przede wszystkim należy pamiętać, że piszę symulację. Jest to samodzielna aplikacja i jest jednowątkowa. Mam zasadniczo dwie klasy obiektów, które mają różne wymagania dotyczące zakresu.
Klasy, które powinny być używane jako singletony podczas całej symulacji. Przykład Random, jako przykład.
Grupy klas, które są tworzone razem, oraz w grupie, każda instancja powinna być traktowana jak Singleton. Na przykład powiedzmy, że
RootObject
jest klasą najwyższego poziomu i ma zależność odClassA
iClassB
, które mają zależność odClassD
. Dla każdego podanegoRootObject
, obie jego zależności (ClassA
iClassB
) powinny zależeć od tego samego wystąpieniaClassD
. Jednak instancjiClassD
nie należy udostępniać w różnych instancjachRootObject
.
Mam nadzieję, że ma to sens. Mogę wymyślić dwa podejścia do tego. Jednym z nich jest zaznaczenie wszystkich wstrzykniętych obiektów jako Singletonów, utworzenie wtryskiwacza głównego i wyodrębnienie wtryskiwacza podrzędnego za każdym razem, gdy trzeba utworzyć nową instancję RootObject
. Następnie instancje RootObject
i wszystkie jego zależności są tworzone jako Singletony, ale informacje dotyczące zakresu są wyrzucane przy następnym uruchomieniu w celu utworzenia kolejnego RootObject
.
Drugie podejście polega na zastosowaniu pewnego rodzaju niestandardowego zakresu.
Dokumentacja Guice daje sprzeczne porady ... Z jednej strony mówi, że powinieneś mieć jeden wtryskiwacz, i to najlepiej, że zostanie wywołany jeden raz, aby stworzyć klasę najwyższego poziomu. Z drugiej strony mówi, aby trzymać się z dala od niestandardowych zakresów.
Mam pomysł, że wstrzyknięcie @Assisted mogłyby zostać wykorzystane tutaj, ale mam problemy z widzeniem, jak dokładnie należy stosować ... – Rich
@Josh: Skąd docu powiedzieć trzymać się z daleka od teleskopów? –
@ A.H., Http://code.google.com/p/google-guice/wiki/CustomScopes - pierwsza linia. "Ogólnie zaleca się, aby użytkownicy nie pisali własnych niestandardowych zakresów - wbudowane zakresy powinny wystarczać dla większości aplikacji." Odkryłem, że pierwsze podejście działa bardzo dobrze - w razie potrzeby można stworzyć wtryskiwacze dla dzieci. Musimy tylko uważać, aby "singletony na grupę" nie przypadkowo dostały się do rodzicielskiego iniektora, ale jest to dość łatwe do sprawdzenia. – Josh