Ich möchte mehrere Versionen der gleichen Art von Abhängigkeitsbaum/Kette instanziieren, die verschiedene Implementierungen für einige der Schnittstellen in diesem Baum/Kette verwenden. Was ist das beste Guice-Training/Muster, das man in diesem Fall verwenden kann?Was ist das beste Muster für die Verwaltung mehrerer Versionen der gleichen Abhängigkeitsstruktur in Guice?
Hier ist ein konkretes Beispiel für mein Problem.
Ich habe eine Writer
Schnittstelle, die möglicherweise ein Datei-Writer oder ein std-out-Writer sein kann, der auf dem Blatt meiner Abhängigkeitshierarchie liegen wird. So etwas wie dieses:
Eine andere Logger-Schnittstelle wird verwendet, um eine Schicht von Indirection auf dem Schreiber hinzuzufügen. Zum Beispiel:
interface Logger { ... }
class LoggerImpl{
@Inject
public Logger(Writer out){ ... }
public void log(String message){ out.println(message); }
}
Dann gibt es einen Client, der den Logger verwendet.
class Client{
@Inject
public Client(Logger logger){ ... }
public void do(){ logger.log("my message"); }
}
Nun würde Ich mag in meinem Programm zwei Arten von Hierarchien verwenden:
- Client -> LoggerImpl -> Filewriter
- Client -> LoggerImpl -> StdOutWriter
Gibt es eine gute Möglichkeit, dies zu verkabeln, ohne ein separates Guice-Modul für 1 und 2 zu verwenden?
Im Idealfall würde Ich mag eine ClientFactory
Klasse wie diese habe:
interface ClientFactory{
public Client stdOutClient();
public Client fileClient();
//or fileClient(File outputFile) for extra points ;)
}
Könnte jemand kommen mit einem Weg, um diese mit diesem Werk verkabeln oder mit anderen Mitteln?
Ich möchte auch eine Lösung, die auf Fälle skalieren würde, wo ich eine größere Vielfalt von längeren Abhängigkeitsbäumen/Ketten habe. Vielen Dank!
Danke für eine großartige Erklärung! Ich habe nun endlich private Module und das Roboterbeineproblem verstanden. Das löst die Frage für mich. Aber der Grund, warum ich die Datei-Variante (Datei) verwenden wollte, ist, weil ich möglicherweise nicht die @FileOut-Variante des Clients zur Laufzeit verwende (das hängt zum Beispiel von einem Befehlszeilenargument ab). Ich könnte ein anderes Guice-Modul instanziieren, je nachdem, ob es eine Datei gibt oder nicht, aber es ist nicht sehr elegant, und da die Anzahl meiner Dependency-Tree-Varianten wächst, würde es ziemlich unangenehm werden. – rodion