2017-02-25 4 views
0

Ich habe eine Klasse, die auf zwei verschiedene Arten injiziert werden soll:Erstellen obejcts mit AssistedInject Fabrik in Guice

  1. für allgemeine Zwecke als Singletons

  2. 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?

Antwort

0

Antwort auf Ihre erste Frage ist ja. In Ihrem Fall werden immer verschiedene Objekte erstellt. Für die zweite Frage weiterlesen.

Es ist falsch, 2 Bindungen auf dieselbe Schnittstelle zu beziehen. Im Fall eines Objekts mit 2 Konstruktoren kommentieren Sie beide mit @AssistedInject und in der Fabrik benötigen Sie 2 Methoden, die diese Konstruktoren widerspiegeln. Dann installieren Sie es einfach mit der FactoryModuleBuilder.

+0

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

+0

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

Verwandte Themen