Hier ist mein Problem:
Es ist zunächst wichtig zu wissen, dass ich eine Simulation schreibe. Dies ist eine eigenständige Anwendung und läuft in einem Thread. Ich habe im Wesentlichen zwei Klassen von Objekten, die unterschiedliche Scoped-Anforderungen haben.
-
Klassen, die als Singleton in der gesamten Simulation verwendet werden sollten. Ein Beispiel wäre eine Instanz von Random.
-
Gruppen von Klassen, die zusammen erstellt werden und innerhalb der Gruppe sollte jede Instanz wie ein Singleton behandelt werden. Zum Beispiel hat die Klasse
RootObject
eine Abhängigkeit vonClassA
undClassB
, die beide wiederum vonClassD
abhängen. Für ein gegebenesRootObject
sollten beide Abhängigkeiten (ClassA
undClassB
) von derselben Instanz vonClassD
abhängen. Instanzen vonClassD
sollten jedoch nicht über verschiedene Instanzen vonRootObject
geteilt werden.
Hoffentlich macht das Sinn. Mir fallen zwei Ansätze dafür ein. Einer ist, alle injizierten Objekte als Singletons zu kennzeichnen, den Wurzel-Injektor zu erstellen und jedes Mal, wenn ich eine neue RootObject
-Instanz erstellen muss, einen Kind-Injektor zu erstellen. Dann werden die Instanzen von RootObject
und all seine Abhängigkeiten als Singletons erstellt, aber diese Scoped-Informationen werden beim nächsten Mal, wenn ich ein weiteres RootObject
erstelle, verworfen.
Der zweite Ansatz besteht darin, eine Art benutzerdefiniertes Scope zu implementieren.
Die Guice-Dokumentation gibt widersprüchliche Ratschläge... Einerseits heißt es, dass man einen einzelnen Injektor haben sollte, der idealerweise einmal aufgerufen wird, um eine Top-Level-Klasse zu erstellen. Andererseits wird davon abgeraten, benutzerdefinierte Scopes zu verwenden.