2016-07-14 11 views
0

Angenommen, ich habe einen Servicetyp Service, der verschiedene Implementierungen hat, ServiceImplX und ServiceImplY. Ich habe auch eine Cache-Schicht, CachedService, die Service implementiert und einige grundlegende Implementierung von Service umschließt, um auf die Daten zuzugreifen.Was ist der beste Weg, denselben Typ zweimal zu binden (z. B. einen Wrapper) für die Abhängigkeitsinjektion in Guice?

Was ich will, ist in der Lage sein, zu binden, eine von ServiceImplX und ServiceImplY als Grund Umsetzung in CachedService injiziert werden, während CachedService sich Service gebunden sein sollten in tatsächliche Kunden dieses Dienstes injiziert werden.

Ich möchte vermeiden, Anmerkungen zu benennen, um dies zu lösen, da das fragil scheint. Gibt es einen sichereren Weg, dies zu erreichen?

+0

Danke, das ist genau das, was ich gesucht habe. Können Sie mir bitte eine Antwort geben, damit ich sie annehmen kann? –

Antwort

1

Definieren Sie eine richtige Bindung Anmerkung:

@RetentionPolicy(RUNTIME) 
@BindingAnnotation 
@interface ServiceBinding {} 

Das ist viel robuster als eine @Named Bindung Anmerkung, weil:

  • Es ist ein Symbol, wie ein Klassenname oder eine Variable, so dass Sie kann leicht Referenzen in Ihrem Code finden; Der Name in einer @Named Annotation kann zur Laufzeit erstellt werden, so dass es viel schwieriger zu finden ist.
  • Sie können die Erreichbarkeit einer verbindlichen Annotation über die Modifikatoren public/private usw. steuern, damit Sie steuern können, wo die Annotation konfiguriert und referenziert wird. Die Zeichenfolgen von @Named Annotationen sind in einem globalen Bereich.