2016-02-05 5 views
11

Zum Beispiel hat RESTEasy's ResteasyWebTarget-Klasse eine Methode proxy(Class<T> clazz), genau wie Injectors getInstance(Class<T> clazz). Gibt es eine Möglichkeit, Guice mitzuteilen, dass die Erstellung einiger Klassen an eine Instanz delegiert werden sollte?Wie kann ich die Erstellung einiger Klassen vom Guice-Injektor an eine andere Fabrik delegieren?

Mein Ziel ist das folgende Verhalten von Guice: Wenn der Injektor nach einer neuen Instanz der Klasse A gefragt wird, versuchen Sie es zu instanziieren; Wenn Instanziierung unmöglich ist, bitten Sie ein anderes Objekt (z. B. ResteasyWebTarget-Instanz), die Klasse zu instanziieren.

Ich möchte ein Modul so schreiben:

@Override 
protected void configure() { 
    String apiUrl = "https://api.example.com"; 
    Client client = new ResteasyClientBuilder().build(); 
    target = (ResteasyWebTarget) client.target(apiUrl); 

    onFailureToInstantiateClass(Matchers.annotatedWith(@Path.class)).delegateTo(target); 
} 

statt

@Override 
protected void configure() { 
    String apiUrl = "https://api.example.com"; 
    Client client = new ResteasyClientBuilder().build(); 
    target = (ResteasyWebTarget) client.target(apiUrl); 

    bind(Service1.class).toProvider(() -> target.proxy(Service1.class); 
    bind(Service2.class).toProvider(() -> target.proxy(Service2.class); 
    bind(Service3.class).toProvider(() -> target.proxy(Service3.class); 
} 

Ich habe darüber nachgedacht, Injector-Schnittstelle implementieren und dass die Umsetzung als Kind Injektor verwenden, aber die Schnittstelle hat zu viele Methoden.

I kann eine Methode schreiben, die alle annotierten Schnittstellen in irgendeinem Paket aufzählt und Guice anweist, Anbieter für sie zu verwenden, aber das ist der Ersatzansatz.

Antwort

2

Guice unterstützt dies nicht, es hat keine Haken für Sie zu hören. Die Haken, die es zur Verfügung stellt (ProvisionListener & TypeListener), werden nicht aufgerufen, wenn eine Bindung nicht gefunden werden kann.

Ich kann eine Methode schreiben, die alle annotierten Schnittstellen in irgendeinem Paket aufzählt und Guice anweist, Provider für sie zu verwenden, aber das ist der Backup-Ansatz.

Das ist Ihre einzige Option. Die optionalen Injektionen funktionieren nur, wenn Sie bereit sind, Ihre target.proxy Liebe über die Codebasis zu verbreiten.

EDIT (2017.02.28): Wenn Sie dies tun werden, habe ich bereits die Grundlagen getan, um es als Teil meines magic-provider-guice Projekt, mit Beispielen für JDBI und Feign geschehen.

Umsetzung Injector-Schnittstelle und verwenden Sie diese Implementierung als Kind Injektor

Ich glaube nicht, Sie ein Kind Injektor einstellen (nur hat Guice schafft eine mit einem Satz von Modulen), so würde dies funktioniert auch nicht.

+0

Nun, Ihre Antwort ist wahrscheinlich die einzig richtige hier. Es ist zu spät für Kopfgeld, sonst hättest du es bekommen, sorry dafür. –

1

https://github.com/google/guice/wiki/Injections Check out Optionale Injektionen, können Sie einen Fall zurück damit erstellen.

+0

Nein, das ist nicht die Lösung. Bei Optionals muss ich einen festen Fallback-Wert haben. Während in meinem Fall Fallback ist, sagen wir, dynamisch und nicht im Voraus bekannt. Oder vielleicht fehlt mir etwas - könntest du ein paar Hinweise geben, wie man Optionals mit Webtargets benutzt? –

Verwandte Themen