Chciałbym utworzyć moduł, który dynamicznie łączy instancje z nazwanymi adnotacjami. Przypadek użycia jest taki, że chciałbym automatycznie powiązać wartości w mojej konfiguracji z kluczem w pliku właściwości będącym wartością @Named.Jak utworzyć dynamiczne powiązania w Guice, które wymagają iniekcji iniekcji?
Jednak konfiguracja jest powiązana z innym modułem, więc potrzebuję wtrysku do konfiguracji. Rozwiązania, na które patrzę, to:
Powiązanie w metodzie configure(). Ta metoda nie jest wprowadzana i nie mogę uzyskać konfiguracji podstawowej.
Korzystanie z dostawcy/@ Zapewnia. Dostawcy wiążą tylko jedno wystąpienie.
Korzystanie z MultiBlacza. Mój przypadek użycia jest trochę inny niż to, co zapewnia to rozszerzenie. Multi-binding pozwala na powiązanie wielu instancji osobno, a następnie wprowadzenie ich jako kolekcji bardziej złożonej zawierającej typ. Chciałbym związać każdą instancję osobno i mieć je jednoznacznie identyfikowalne dla wtrysku.
Użyj childInjector. Niestety nie jest to możliwe bez jakiejś szerokiej modyfikacji istniejącego kodu. This answer jest bardzo dobrym opisem sposobu rozwiązania tego problemu w ten sposób.
W jakiś sposób wstrzyknij spinacz. (Zacząłem robić się trochę bardziej niepewny) Guice pozwala na wstrzyknięcie wtryskiwacza do drugiego zastosowania, próbowałem wstrzyknąć spoiwo do modułu metodą @Provides, a następnie użyć spoiwa bezpośrednio, aby wykonać wiele wiązań w ramach metody. Guice nie wstrzyknęłaby spoiwa.
Kolejna dobra odpowiedź, dzięki! Nie wiedziałem o metodzie Names.bindProperties(), będę musiał to zapisać na później. Wypróbowałem rozwiązanie, które zaproponowałeś w zeszłej nocy 2 i to w większości zadziałało, chociaż nie było tak czyste, to bym mu się spodobał. Zasadniczo doszedłem do wniosku, że to, co chciałbym robić, nie należy do projektu Guice. Nie jestem właścicielem frameworka, w którym wdrażam i nie wierzę, że wtryskiwacze dla dzieci będą dostępne w najbliższym czasie, więc zamierzam przerobić naszą konfigurację nieco inaczej. Dziękuję za szybką odpowiedź! –