2013-12-22 9 views
7

Nachdem mit Guice zu tun, frage ich mich, wie ich Abhängigkeiten in Bezug auf die Module behandeln soll.Stellen Sie sicher, Module In Guice nur einmal geladen wird

In Guice wird jedes Modul durch eine Instanz bereitgestellt. Wenn ich also ein Modul benötige, das einen bestimmten Dienst benötigt, erstellt es das Modul, fügt dem Dienst eine Bindung hinzu und installiert es (binder.install (Modul)).

Jetzt habe ich zwei unabhängige Module, die völlig unabhängig voneinander sinnvoll sind und beide das gleiche Datenbankmodul installieren.

Mit beiden Modulen unabhängig voneinander kein Problem auftreten, aber was passiert, wenn beide Module in der gleichen Anwendung verwendet werden? Das Datenbankmodul wird von beiden Modulen unabhängig geladen und das kann nicht korrekt sein.

Gibt es eine Möglichkeit, den Ordner zu fragen, ob ein bestimmter Typ bereits eine Bindung hat? Ich kann getProvider nicht verwenden, um das zu überprüfen, da alles, was zurückgegeben wird, ein LookupProvider ist, egal ob etwas bereits bind ist oder nicht.

Wie muss man sich mit diesem Szenario umgehen?

Update:

Es Nähte Guice nicht in der Lage ist, die folgende Funktion zur Verfügung zu stellen:

  1. prüfen, ob ein bestimmtes Modul bereits geladen wurde.
  2. Überprüfen Sie, ob eine bestimmte Klasse wurde bereits gebunden.
  3. Verwenden Provider innerhalb der Konfiguration der Lage sein, verteilte Konfiguration zu tun (Module konfigurieren zu können Objekte beigetragen werden).

Antwort

11

Guice hat zwei Funktionen, um mit dieser Situation umzugehen. Das erste ist Modul Deduplizierung. Das bedeutet, dass, wenn zwei Module installiert sind, die äquivalent sind (durch equals() und hashCode()), wird nur die eine configure() Verfahren ausgeführt werden soll. Jedoch ist diese Lösung etwas spröde, weil es nicht SPI Transformationen überleben, Modules.override() usw.

Die zweiten und IMO bessere Lösung ist Bindung Deduplizierung. Dies bedeutet, dass Guice Bindings akzeptiert, die exakte Duplikate sind. Also, wenn Ihr Modul bind(Interface.class).to(Implementation.class) tut, ist es nicht einmal eine Rolle, wenn seine configure() Methode zweimal ausgeführt wird, weil Guice die doppelte Bindung ganz gut handhaben.

+0

So wurden hinzugefügt ich meine eigene Implementierung benötigen? Wie Module in Abhängigkeiten gruppieren und Abhängigkeiten auf eine bestimmte Art auflösen. Aus dem Code habe ich verstanden, dass die Module in der Reihenfolge von links nach rechts oder vorletzter ausgeführt werden. –

+0

Die Reihenfolge, in der die Module installiert werden, ist unbedeutend. Deshalb gibt es keine Möglichkeit zu prüfen, ob eine Bindung "noch" erstellt wurde. –

+0

Ja, aber der Code geht einfach die angegebene Modulliste auf diese Weise. Am Ende muss ich noch viel mehr zum Guice-Code hinzufügen, um diese wichtige Abkürzung zu überwinden. –

0

Da Guice nicht unterstützen bestimmte benötigte Funktionalität es emuliert werden müssen. Der Multibinder-Code bietet eine Idee. Eine andere Idee, die ich derzeit verwende, ist die Verwendung von Reflektion, um den obersten Binder während des Injektorbauprozesses zu finden. Wenn man diesen Ordner kennt, kann man leicht benötigte Metainformationen hinzufügen und bestimmte Objekte verfolgen.

Die Meta-Informationen werden gelöscht, sobald der Build-Prozess beendet.

Normalerweise baut man nur einen Injektor auf einmal, aber wir sollten uns davor schützen.

nehmen also einen Blick auf die einzelnen meisten Binder-Implementierung (RecordingBinder). Es bietet ein Feld Eltern, die wir zum Root-Binder-Element gehen können. In der Regel verwendet Guice einen einzigen Ordner, aber im Fall von privaten Modulen.

Eine andere Idee, die nicht so sicher ist, aber ohne Reflexion kommt, ist die Verwendung eines lokalen Thread, wenn Sie sicherstellen können, dass immer nur ein Guice-Injektor auf einmal erstellt wird.

In der Lage, den Build-Prozess zu identifizieren und zu verfolgen, welche Builder gleichzeitig verwendet werden, ist es möglich, jede Art von zusätzlicher Logik in guice hinzuzufügen, wie die doppelte Installation einer Abhängigkeit zu verhindern.

Verwandte Themen