2009-08-02 9 views
1

Ich habe eine Guice-basierte App, die jetzt mehrere Instanzen eines bestimmten Typs benötigt, so dass ich eine benannte Annotation zur Disambiguierung der Abhängigkeiten planen. Allerdings muss eine Abhängigkeit dieses Typs auch abhängig davon variieren, welche ich erhalte.Guice: Variieren des Typs injiziert nach dem wie der Besitzer injiziert wurde

Zur Veranschaulichung läßt ich

@Singleton 
public class FooCache { 
    private final FooCacheListener listener; 
    @Inject 
    public FooCache(FooCacheListener listener) { 
     this.listener = listener; 
    } 
    // do stuff 
} 

sagen haben und kann dann sagen, dass ich ein Bedürfnis nach zwei separaten Instanzen habe, damit ich

@ThatOne FooCache 

in einer Klasse und

@ThisOne FooCache 
haben könnte

in einem anderen.

Nun sagen wir, dass ich in jedem Fall einen anderen Listener haben möchte (vielleicht schreibt man etwas in eine Datenbank und der andere sendet eine Benachrichtigung über JMS oder an einen verteilten Cache). Wie würde ich das tun? Ich kann nicht sehen, dass ich einen Namen auf den FooCacheListener kleben kann, da ich in einer Situation einen anderen Namen brauchen würde, während ich hier nur einen Platz habe. Der einzige Weg, wie ich das machen kann, ist, FooCache abzulagern, aber das scheint mir eine ziemlich ungeschickte Herangehensweise zu sein.

Prost Matt

Antwort

2

könnten Sie in der Lage sein PrivateModules zu verwenden. Gehen Sie here und scrollen Sie nach unten zu Wie baue ich zwei ähnliche, aber leicht unterschiedliche Bäume von Objekten? Es ist eine Möglichkeit, zwei verschiedene Instanzen der gleichen Klasse zu haben, was fast genau das klingt, was Sie versuchen zu tun. Sie könnten Ihre Cachelistener anstelle der im Beispiel übergebenen "Lefty" und "Righty" übergeben. Es gibt mehr Links mit Details von dort, wenn es so aussieht, wie Sie wollen.

Eine andere Möglichkeit könnte darin bestehen, eine Fabrik, die auch im obigen Link beschrieben wird, in die Frage zu injizieren. Wie gebe ich einen Parameter beim Erstellen eines Objekts über Guice weiter?

+0

irgendwie habe ich das in der docs verpasst, das ist, was ich suche. Vielen Dank. – Matt

Verwandte Themen