Ich habe eine Klasse, die auf zwei verschiedene Arten injiziert werden soll:Erstellen obejcts mit AssistedInject Fabrik in Guice
für allgemeine Zwecke als Singletons
angepasste Version als RequestScoped.
Beispiel:
public class TaskProcessorService implements TaskProcessor {
private final TaskRegistry taskRegistry;
@Inject
public TaskProcessorService(TaskRegistry taskRegistry){
this(taskRegistry, null);
}
@AssistedInject
public TaskProcessorService(TaskRegistry taskRegistry, @Assisted String userId) {...}
public synchronized void performTask(){...}
}
Sagen wir, jeder Gegenstand für allgemeine Zwecke verwenden können, und konkurrieren um performTask Betrieb (da es synchronisiert wird), oder können sie investieren und schaffen es eigene Instanz/Instanzen ist.
Für allgemeine Zwecke i erstellt haben Schnittstelle
public interface TaskProcessor{
void performTask();
}
und Bindung:
bind(TaskProcessor.class).to(TaskProcessorService .class).in(Singleton.class);
und für angepasste Version Ich habe Fabrik erstellt
public interface TaskProcessorFactory{
public TaskProcessor(@Assisted String userId);
}
und installiert es:
install(new FactoryModuleBuilder()
.implement(TaskProcessorService.class, TaskProcessorService.class)
.build(TaskProcessorFactory.class));
Ich habe es ausprobiert und es funktionierte in der Laufzeit (ich hoffe, dass ich keine Fehler über Stücke von Code per Hand schreiben), ich bin nicht sicher, ob es funktioniert, wie ich wollte, seit ich es geschrieben habe und hatte noch keine Zeit, es noch vollständig zu testen.
Aber dann erkannte ich, dass ich nicht weiß, wie die Fabrik funktioniert. Für verschiedene Benutzer ('userId') sollte es verschiedene Instanzen erstellen, aber was ist mit der gleichen userId? Nehmen wir an, einige John Doe möchten 3 Instanzen von TaskProcessorService erstellen. Wird die Factory 3 verschiedene Instanzen für jeden Aufruf erstellen (vorausgesetzt, der Parameter ist der gleiche - John Does ID)?
Das ist die Hauptfrage, erstellt die Fabrik immer neue Objekte auch für Aufrufe mit den gleichen Parametern? Konnte in Dokumenten keinen Beweis dafür finden, und ich bin nicht 100% sicher, wenn ein Caching-Mechanismus nicht erstellt wurde.
Und zweites Problem, ist es optimale Lösung für das Problem?
Thx für den ersten Teil. Über den FactoryModuleBuilder - ich glaube, dass Sie Singleton-Instanz nicht aus dem ersten Konstruktor erzwingen können. Endlich über 2 Bindungen - technisch stimmt es, was du gesagt hast, meine Lösung entlarvt sie (nicht direkt aber trotzdem), auf der anderen Seite kannst du die Schnittstelle kein Problem injizieren und ich kann keine bessere Lösung finden. – Rychu
Ist das eine Voraussetzung, dass Sie Singletons vom ersten Konstruktor zur Verfügung stellen müssen? Wenn ja, können Sie eine benutzerdefinierte Factory schreiben und Guice AssistedBinding insgesamt umgehen. – Nektie