2013-07-03 17 views
18

Podczas używania sztyletu zauważyłem, że otrzymuję wiele wystąpień singletonu, gdy wstrzykiwam go tam, gdzie jest to potrzebne. Zanotowałem klasę i metodę dostarczania z @Singleton. Czy ktokolwiek może pomyśleć, dlaczego tak się dzieje?Singletons in Dagger 1.x

Edit:

Jeśli to nie pomaga, śledzę tę samą strukturę dla mojej aplikacji jako przykładowej aplikacji w sztyletu GitHub (https://github.com/square/dagger/tree/master/examples/android-activity-graphs). Próbuję uzyskać Singleton w podstawowej działalności i kilka klas stron trzecich dostarczonych przy użyciu @Provides w niestandardowej klasie Application. Czy to dlatego, że dodam moduły przy każdym działaniu do oryginalnego wykresu obiektów?

(PS: Jestem nowy w sztylet i DI w ogóle, więc będę wdzięczny, gdyby mógł Pan podać wyjaśnienie, abym mógł nauczyć się dzięki.).

Odpowiedz

39

@Singleton w Dagger 1.x działa inaczej niż myślisz. Definicja specyfikacji JSR-330 w javadoc @Singleton jest "jedna na wykres" iw ten sposób Dagger ją interpretuje.

Więc jeśli masz coś oznaczonego jako @Singleton, a jest ono zmaterializowane na wykresie aplikacji (w przeciwieństwie do wykresu o krótszym okresie życia), otrzymujesz jedną instancję na aplikację.

Jeśli masz przypisany artykuł @Singleton, który znajduje się w modułach używanych do konfigurowania wykresu aktywności (tj. Który jest uzyskiwany z części wykresu określonej przez moduł używany w operacji plus(), otrzymasz wykres jedno-na-aktywność.

Jeśli potrzebujesz czegoś, aby raz na aplikację, musisz się upewnić, że zostanie utworzony jako część wykresu aplikacji. Możesz to zrobić na jeden z dwóch sposobów. Albo jawnie zapewnij mu metodę @Provides z twojego modułu (modułów) aplikacji, albo możesz wymienić ją jako jedną z klas w @ module (injects = ...) w module aplikacji.

(Jeśli nie oznacz go @Singleton niż dostaniesz po jednym w miejscu wstrzyknięcia.)

Więc pamiętaj, wykres utworzony przez plus() jest postrzegana jako osobny wykres, który wskazuje na wykresie, z którego został utworzony i opakowuje go, może uzyskać dostęp do instancji w nim, ale nie jest tym samym wykresem.

Uwaga - Dagger 2.x poprawia to wspiera opisów zwyczaj scopingu, że mechanizm jest podobny, z jednym wykresie (składnika) na zakres adnotacją, z relacji nadrzędny/podrzędny między wykresami szersze/węższe wcieleń

+0

Dzięki za wyczyszczenie tego. Kiedy mówisz spec, masz na myśli JSR330? – Raghuveer

+0

Tak. Przepraszamy - dokonam edycji odpowiedzi. –

+0

@ChristianGruber Jak to ma zastosowanie do konstruktorów wstrzykiwanych Singleton używanych w różnych podrysach wykresu macierzystego? Czy to oznacza jeden na wykres, w którym klasa jest używana, chyba że już istnieje na wykresie rodzica? – vinc3m1