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.
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. –