2016-12-01 3 views
1

Ich habe ein Setup, wo ich mehrere Instanzen einer Klasse binden. Der Unterschied zwischen den Klassen ist ein Eingabeparameter. Die beiden Instanzen werden immer injiziert.Könnte ein Provider zwischen verschiedenen Instanzen wählen

Die Bindungen sieht so aus.

CmsExportAwsWriterSingle cmsExportAwsWriterSingleTranslation = new CmsExportAwsWriterSingle("testing-v1", getCredentials(id, secret)); 
bind(CmsExportWriter.class) 
.annotatedWith(Names.named("config:export.writer.translation")) 
.toInstance(cmsExportAwsWriterSingleTranslation); 

CmsExportAwsWriterSingle cmsExportAwsWriterSingleReview = new CmsExportAwsWriterSingle("prod-v1", getCredentials(id, secret)); 
bind(CmsExportWriter.class) 
.annotatedWith(Names.named("config:export.writer.review")) 
.toInstance(cmsExportAwsWriterSingleReview); 

Jetzt habe ich zwei Dienste, die javax.inject Provider verwendet, um mir eine Instanz eines Schreibers zu geben.

Gibt es eine Möglichkeit, dass der Provider mir korrekte Instanzen der Klassen gibt, die ich in das Setup injiziert habe?

Z. B Wenn ich ServiceOne wollen die Verfasser bekommen namens "config:export.writer.translation" Und ServiceTwo"config:export.writer.review"

zu bekommen Oder muss ich den Anbieter abandond und @Named in der Konstrukteurs der Dienste nutzen.

Nur mit @Named wont mir die Vorteile als Provider tut. Und ich brauche es jedes Mal neue Instanzen der Autoren.

Sieht aus wie der Weg zu gehen ist, die Provider stattdessen zu injizieren.

Antwort

0

Der Provider dient zum Erstellen einer neuen Instanz bei jedem Aufruf seiner Methode get. Dies ist für den Fall angemessen, wenn eine Abhängigkeitsinstanz bei der Erstellung des umschließenden Objekts nicht injiziert werden kann/sollte oder wenn mehrere Instanzen benötigt werden usw. Dies geschieht nicht durch die Injektion für mehrere Bindungen.

Der richtige Weg, Instanzen mit mehreren Bindungen zu injizieren, ist über Bindungsanmerkungen. Es gibt zwei Arten von Bindungsanmerkungen: build-in @Named-Annotation oder benutzerdefinierte Annotation, die gemäß der Standardvorlage implementiert werden sollte.

Sie können einige Beispiele here

finden
Verwandte Themen