Ich möchte ein Modul erstellen, das Instanzen dynamisch an benannte Anmerkungen bindet. Der Anwendungsfall ist, dass ich die Werte in meiner Konfiguration automatisch mit dem Schlüssel in der Eigenschaftendatei verknüpfen möchte, der der @ Named-Wert ist.Wie machen Sie dynamische Bindungen in Guice, die eine injizierte Instanz benötigen?
Allerdings ist die Konfiguration in einem anderen Modul gebunden, daher muss ich die Konfiguration injizieren. Lösungen, die ich angeschaut habe sind:
Bindung in der configure() -Methode. Diese Methode wird nicht injiziert und ich kann die Basiskonfiguration nicht abrufen.
Verwenden eines Providers/@ Bietet. Provider binden nur eine einzelne Instanz.
Verwenden von MultiBinder. Mein Anwendungsfall unterscheidet sich etwas von dem, was diese Erweiterung bietet. Multi-Binding ermöglicht es Ihnen, mehrere Instanzen separat zu binden und sie dann als komplexere Collection-Typen zu injizieren. Ich möchte jede Instanz separat binden und sie für die letztgenannte eindeutig identifizierbar haben.
Verwenden Sie einen ChildInjector. Leider ist dies ohne eine umfangreiche Modifikation des bestehenden Codes nicht möglich. This answer ist eine sehr gute Beschreibung, wie man dieses Problem auf diese Weise lösen kann.
Injizieren Sie den Binder irgendwie. (Ich fing an, ein wenig hackier) Guice ermöglicht Injektion der Injector für den späteren Gebrauch, versuchte ich die Injektion der Bindemittel in das Modul, obwohl eine @ Provides-Methode und dann mit dem Bindemittel direkt zu machen mehrere Bindungen innerhalb der Methode. Guice würde den Binder nicht injizieren.
Eine weitere gute Antwort, danke! Ich wusste nichts von der Methode "Names.bindProperties()", ich muss diese für letztere speichern. Ich habe letzte Nacht die Lösung ausprobiert, die Sie in 2 vorgeschlagen haben, und es hat größtenteils funktioniert, obwohl es nicht so sauber war, hätte ich es gemocht. Ich kam im Grunde zu dem Schluss, dass das, was ich gerne tun würde, außerhalb von Guices Design liegt. Ich besitze nicht das Framework, in dem ich arbeite, und ich glaube nicht, dass Kinderinjektoren bald verfügbar sein werden, also werde ich unsere Konfiguration ein wenig anders überarbeiten. Danke für die schnelle Antwort! –