Anwendung migrieren, um Guice zu verwenden - wie man Transaktionen in bestehende Objekte einfügt?

8

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

ist

Der 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?

    
Kyle Krull 04.06.2009, 17:01
quelle

2 Antworten

6

Wenn ich das richtig verstanden habe, hat Ihr Problem zwei unabhängige Teile:

  1. Verwenden der richtigen Transaction-Instanz in Guice-fied-Klassen
  2. Verwenden der richtigen Transaction-Instanz für Legacy-Klassen.

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.

    
Fernando 06.06.2009, 11:32
quelle
1

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:

%Vor%

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.

    
Jesse Wilson 05.06.2009 01:32
quelle

Tags und Links