Ich bin neu bei Guice und arbeite gerade an einer Anwendung mit einer großen Menge Legacy-Code. Es hat mehrere Klassen, die wie folgt aussehen:
%Vor%Es ist ziemlich klar, wie Guice verwendet wird, um Instanzen zu binden, die sich nie ändern, aber was ist mit Instanzen, die sich ändern (d. h. Transaktionen)? Gibt es eine Möglichkeit für mich, Guice zu verwenden, um eine andere Instanz von Transaction zu injizieren, wenn sich diese ändert? Beachten Sie, dass die Transaktionsinstanz keine der gut unterstützten JPA / Hibernate / Spring-Transaktionen
istDer am wenigsten invasive Ansatz, den ich mir vorstellen kann (die Notwendigkeit, jede Klasse, die eine Transaktion gleichzeitig verwendet, zu migrieren) würde Guice verwenden, um Transaction nur beim Instanziieren von Objekten einzufügen, und ich würde den vorhandenen Anwendungscode beibehalten Transaktionen bei Bedarf. Zum Beispiel könnte dieser Provider verwendet werden, um neue Objekte mit der aktuellen Instanz von Transaction zu injizieren:
%Vor%Die Anwendungslogik sieht ungefähr so aus:
%Vor%Gibt es andere Möglichkeiten, die Instanz von Transaction, die vorhandene Klassen verwenden, zu aktualisieren, ohne jede Klasse gleichzeitig migrieren zu müssen?
Wenn ich das richtig verstanden habe, hat Ihr Problem zwei unabhängige Teile:
Bei '1' funktioniert Ihr benutzerdefinierter Provider, aber ich würde einen benutzerdefinierten Bereich für eine Transaktion erstellen und die Transaction-Klasse in diesem Bereich binden. Anweisungen zu benutzerdefinierten Bereichen finden Sie unter Empfehlungen .
In Bezug auf '2' ist dies das übliche Problem bei der Verwendung von Guice, um Instanzen für Legacy-Klassen bereitzustellen. Sie haben den Code, der Transaction-Instanzen derzeit zu Legacy-Klassen zur Verfügung stellt, nicht erwähnt, aber Sie könnten diesen Code ändern, um eine Instanz von Guice anzufordern. Da Sie sich in Ihrem "Transaktionsbereich" befinden, kümmert sich Guice um die Bereitstellung der richtigen Instanz.
Sehen Sie sich Assisted Inject an. Um es zu verwenden, definieren Sie eine dreizeilige Schnittstelle:
%Vor% ... und verwenden Sie dann eine Bindung FactoryProvider
, um die Factory zu binden:
Dann können Sie eine DataAccessClassFactory
injizieren, wo immer Sie eine DataAccessClass
erstellen möchten. AssistedInject ist in Guice 2 enthalten, erfordert jedoch eine separate JAR-Datei.
Tags und Links migration transactions guice