Ändern der Guice-Bindungen zur Laufzeit

8

Ich möchte die Guice-Injektionen zur Laufzeit ändern können, um mehrere Injektionen basierend auf Benutzereingaben zu unterstützen. Das möchte ich erreichen:

%Vor%

Ich dachte daran, meinen eigenen Provider zu schreiben, aber ich weiß nicht, wie ich diesen Provider verwenden soll, um meine Bindungen zur Laufzeit zu ändern. Jede Eingabe ist willkommen und geschätzt:)!

Aktualisieren Hier ist, was ich mir gerade ausgedacht habe, es ist nicht so schön, wie ich es möchte, also bin ich immer noch auf der Suche nach Feedback

%Vor%     
Nepoxx 05.06.2014, 18:34
quelle

1 Antwort

12

Ihre Version ist fast perfekt, so wie sie ist: Sie müssen ein Objekt injizieren, das basierend auf dem von Ihnen geschriebenen Code das eine oder andere zurückgibt und keine assistierte Injektion oder ähnliches benötigt. Das heißt, Sie können einige der Voreinstellungen überspringen:

%Vor%

In diesem Fall wäre Ihre MyClass genau identisch. % Co_de% ist entweder die generische Schnittstelle mit einer Methode com.google.inject .Provider oder das entsprechende integrierte javax.inject.Provider dass es sich ausdehnt. Weitere Informationen zu Guice-Anbietern finden Sie auf dem entsprechenden Guice-Wiki-Thema .

%Vor%

Wenn Sie einen Schlüssel Provider (an eine Klasse, einen Provider, eine Foo -Methode oder eine Instanz) binden, verwenden Sie wird automatisch entweder @Provides oder Foo ohne zusätzliche Arbeit injiziert. Provider sind auch eine gute Möglichkeit sicherzustellen, dass Sie bei jedem Aufruf von Provider<Foo> eine neue Instanz erhalten, wenn Sie das möchten. Mit Ihrem Original erhalten Sie immer die gleiche Instanz von EarthDao oder MarsDao für jeden von Ihnen injizierten DomainProvider. (Wenn Sie eine Bereichsbindung wie @Singleton haben, wird Guice das auch respektieren; Provider lässt Guice nur involvieren, anstatt eine einfache alte Java-Referenz zu verwenden.)

Das bedeutet, dass Sie Ihren benutzerdefinierten EarthDaoProvider und MarsDaoProvider überspringen können, es sei denn, Sie müssen wirklich eine externe Initialisierung für sie durchführen. An diesem Punkt sollten Sie besser get aufrufen, damit EarthDao direkt injiziert wird. Sie könnten DomainProvider auch direkt eine IDao-Instanz zurückgeben lassen, indem Sie bind(EarthDao.class).toProvider(EarthDaoProvider.class) auf dem entsprechenden Provider aufrufen und sicher sein, dass es jedes Mal eine neue Instanz ist.

    
Jeff Bowman 05.06.2014, 23:15
quelle