Benutzerdefinierte Guice Umfang, oder einen besseren Ansatz?

Hier ist mein problem:

Ist es zunächst wichtig zu wissen, dass ich Schreibe eine simulation. Dies ist eine standalone-Anwendung, und ist single-threaded. Ich habe im wesentlichen zwei Klassen von Objekten, die unterschiedliche scoping-Anforderungen.

  1. Klassen, die verwendet werden sollte als Singleton während der gesamten simulation. Eine Instanz von Random, als ein Beispiel.

  2. Gruppen von Klassen, die gemeinsam entstehen, und innerhalb der Gruppe, jede Instanz sollte behandelt werden wie ein Singleton. Zum Beispiel, sagen RootObject ist die top-level-Klasse, und hat eine Abhängigkeit zu ClassA und ClassB, beide haben eine Abhängigkeit zu ClassD. Für jede gegebene RootObject sowohl seine Abhängigkeiten (ClassA und ClassB), sollte davon abhängen, die gleiche Instanz der ClassD. Jedoch Instanzen von ClassD sollte nicht freigegeben werden über verschiedene Instanzen von RootObject.

Hoffentlich, die Sinn macht. Mir kommen zwei Lösungsansätze. Einer ist, alle zu markieren, der die injizierten Objekte als Singletons, erstellen Sie den root-Injektor, und spin-off-Kind-Injektor jedes mal, wenn ich brauche, um eine neue zu erstellen RootObject Instanz. Dann werden die Instanzen von RootObject und alle seine Abhängigkeiten erstellt werden als Singletons, aber das scoping information wird weggeworfen, das nächste mal, wenn ich gehe, um einen anderen RootObject.

Der zweite Ansatz ist die Umsetzung der irgendeine Art von benutzerdefinierten Bereich.

Die Guice-Dokumentation gibt widersprüchliche Ratschläge... Auf der einen Seite heißt es, man sollte einen einzelnen Injektor, und im Idealfall wird einmal aufgerufen, um einige top-level-Klasse. Auf der anderen Seite, es sagt, zu bleiben Weg von benutzerdefinierten Bereichen.

  • Ich habe eine Idee, @Assisted injection könnte hier eingesetzt werden, aber ich habe Schwierigkeiten, genau zu sehen, wie es verwendet werden soll...
  • Wo kommt die Doku sagen, zu bleiben Weg von scopes?
  • code.google.com/p/google-guice/wiki/CustomScopes - die erste Zeile. "Es wird allgemein empfohlen, dass Benutzer nicht schreiben Sie Ihre eigene benutzerdefinierte Bereiche — die integrierte Bereiche sollten für die meisten Anwendungen ausreichend." Ich habe festgestellt, dass der erste Ansatz sehr gut funktioniert - erstellen von Kind-Injektoren benötigt. Wir müssen nur darauf achten, dass die "singletons pro Gruppe" nicht versehentlich an den übergeordneten Injektor, aber das ist ziemlich leicht zu überprüfen.
  • Danke für das Zitat. Neben diesem Zitat hätte ich empfohlen, einen benutzerdefinierten Bereich, denn dies wäre eine perfekte Passform in Ihrem Fall gegeben, eine Einschränkung: Jede Klasse gehört genau in Ihre "Gruppen".
  • Ja, ich weiß, dass Sie einen benutzerdefinierten Bereich ist wahrscheinlich der bevorzugte Weg... Richtlinien wie die zitierte sind nur, dass... - Richtlinien. Ich konnte nicht wirklich genug Beispiele für benutzerdefinierte Bereiche, um bequem zu sein zu erstellen. Wenn Sie hatte auf die Implementierung der Ideen, wäre ich interessiert, Sie zu sehen.
InformationsquelleAutor Josh | 2012-03-30
Schreibe einen Kommentar