Hier ist mein Problem:Custom Guice Scope oder ein besserer Ansatz?
Es ist zunächst wichtig zu wissen, dass ich eine Simulation schreibe. Dies ist eine eigenständige Anwendung und ist single-threaded. Ich habe im Wesentlichen zwei Klassen von Objekten, die unterschiedliche Scoping-Anforderungen haben.
Klassen, die während der gesamten Simulation als Singletons verwendet werden sollen. Eine Instanz von Random als Beispiel.
Gruppen von Klassen, die zusammen erstellt werden, und innerhalb der Gruppe sollte jede Instanz wie ein Singleton behandelt werden. Beispiel:
RootObject
ist die oberste Klassenklasse und hat eine Abhängigkeit vonClassA
undClassB
, die beide eine Abhängigkeit vonClassD
haben. Für jedes gegebeneRootObject
sollten seine beiden Abhängigkeiten (ClassA
undClassB
) von derselben InstanzClassD
abhängen. Instanzen vonClassD
sollten jedoch nicht für verschiedene Instanzen vonRootObject
freigegeben werden.
Hoffentlich macht das Sinn. Ich kann mir zwei Ansätze vorstellen. Eine besteht darin, alle injizierten Objekte als Singletons zu markieren, den Root-Injektor zu erstellen und jedes Mal, wenn ich eine neue RootObject
-Instanz erstellen muss, einen Kind-Injektor auszugeben. Dann werden die Instanzen von RootObject
und alle ihre Abhängigkeiten als Singletons erstellt, aber diese Scoping-Informationen werden beim nächsten Mal weggeworfen, wenn ich gehe, um einen anderen RootObject
zu erstellen.
Der zweite Ansatz besteht darin, eine Art von benutzerdefinierten Bereich zu implementieren.
Die Guice-Dokumentation gibt widersprüchliche Ratschläge ... Auf der einen Seite heißt es, dass Sie einen einzigen Injektor haben sollten, und dass es idealerweise einmal aufgerufen wird, um eine Top-Level-Klasse zu erstellen. Auf der anderen Seite heißt es, sich von benutzerdefinierten Bereichen zu entfernen.
Ich habe eine Idee, dass @Assisted Injektion hier verwendet werden könnte, aber ich habe Probleme genau zu sehen, wie es verwendet werden soll ... – Rich
@ Josh: Wo kommt der Doku sagen Abstand halten von Scopes? –
@ A.H., Http://code.google.com/p/google-guice/wiki/CustomScopes - erste Zeile. "Es wird im Allgemeinen empfohlen, dass Benutzer keine eigenen benutzerdefinierten Bereiche schreiben - die integrierten Bereiche sollten für die meisten Anwendungen ausreichen." Ich habe festgestellt, dass der erste Ansatz sehr gut funktioniert - Kinder injizieren nach Bedarf. Wir müssen nur darauf achten, dass die "Singletons pro Gruppe" nicht versehentlich in den Eltern-Injektor gebunden werden, aber das ist ziemlich einfach zu überprüfen. – Josh