2012-03-29 5 views
1

Ich habe folgende Factory-Klasse:kann guice eine fabrik für mich erstellen?

public class MessagePresenterCreator implements IPresenterFactory{ 
    @Override 
    public MessagePresenter createPresenter(Message m) { 
     if (m instanceof Letter) { 
      return new LetterPresenter(); 
     } 
     if (m instanceof Cable) { 
      return new CablePresenter(); 
     } 
     if (m instanceof Postcard) { 
      return new PostcardPresenter(); 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

Kann ich eine guice konfigurieren solche Fabrik durch die folgende Schnittstelle zur automatischen Erzeugung und Versorgung:

public interface IPresenterFactory { 
    public abstract MessagePresenter createPresenter(Message m); 
} 
+0

Fragen Sie, ob Guice die Logik herausfinden kann, die erforderlich ist, um eine Nachricht in einen Nachrichtenmoderator zu verwandeln? Dann nein. –

+0

Ich frage, ob ich ein Guice-Modul konfigurieren kann, das Letter-> LetterPresenter etc 'und Guice wird die Fabrik für mich erstellen. – oshai

Antwort

1

Kein guice hat keine Fabrik wie das eingebaut. Sie könnten eine Fabrik schreiben, die eine Map<Class<? extends Message>, Class<? extends MessagePresenter> nahm und die Reflexion verwendet. Auf diese Weise können Sie es in einem Modul verwalten, wenn dies Ihr Ziel ist.

public class MessagePresenterCreator implements IPresenterFactory{ 
    private final Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping; 
    public MessagePresenterCreator(Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping) { 
     this.mapping = mapping; 
    } 

    @Override 
    public MessagePresenter createPresenter(Message m) { 
     Class<? extends MessagePresenter> clazz = mapping.get(m); 
     if (clazz == null) { 
      throw new UnsupportedOperationException(); 
     } 
     return clazz.newInstance(); 
    } 
} 
4

Ich mag auf zwei Arten von Fabriken denken - Fabriken, die nur Objekte aus Komponenten zusammenzubauen, und Fabriken, die in dieser Versammlung bedingte Logik zu tun.

Ihre Fabriken haben Logik hinter sich. Guice kann diese Logik nicht automatisieren, weil sie einfach die Verdrahtung von Abhängigkeiten handhabt. Wenn Sie einen Typ erstellt haben, der einige injizierte Abhängigkeiten benötigt, und einige Dinge, die nur zum Zeitpunkt der Erstellung bereitgestellt werden, dann kann die automatische Verdrahtung von Fabriken mit der AssistedInject extension von Guice erfolgen. Dadurch können Sie eine Factory-Schnittstelle angeben, alle Felder im erstellten Typ mit @AssistedInject annotieren, und die Erweiterung von guice würde eine Factory-Implementierungsklasse erstellen, die alles injizieren würde, das an den Injector gebunden ist, und diese create() -Parameter weitergibt. Aber in diesem Fall ziehen Guice und AssistedInject alle Teile zusammen - die Dinge werden nach einem vorher festgelegten Rezept verkabelt. Es trifft nicht in letzter Minute Entscheidungen über sie.

Sie stellen die bedingte Erstellung von Objekten bereit. Das wird nicht funktionieren.

An idea above erwähnt eine Fabrik für die Erstellung von Karten Typ Moderator hängt - so etwas wie:

Map<Class<? extends Message>, Class<? extends MessagePresenter>> 

Dies ist ein guter Ansatz, wenn man es mit den Multibindern MapBindings kombinieren. (Ich muss diese Dokumente aufpeppen ... hmm)

Mit diesem Ansatz können Sie eine erweiterbare Factory erstellen - Definieren der anfänglichen Zuordnungen von Message -> MessagePresenter-Unterklassen, aber die Möglichkeit offen für weitere Zuordnungen später, ohne zu ändern Ihr Werk - binden nur mehr Zuordnungen auf dem Multibinder, etwa so:

MapBinder<String, Snack> mapbinder = MapBinder.newMapBinder(
    binder(), 
    new TypeLiteral<Class<? extends Message>>(){}, 
    new TypeLiteral<Class<? extends MessagePresenter>>(){}); 
mapbinder.addBinding(MyMessage.class).toInstance(MyMessagePresenter.class); 
mapbinder.addBinding(YourMessage.class).toInstance(YourMessagePresenter.class); 

Und Sie können in so viele Module dies tun, wie Sie möchten, mehr Typen, zwischen denen das Hinzufügen der Zuordnung zu wechseln, verwenden.

+0

hmmm, ich versuche das zu tun mit der Bindung der Karte > und es funktioniert überhaupt nicht http://stackoverflow.com/questions/14833777/guice-multibinder-with-providers Ich liebe die Funktion aber scheint nicht zu funktionieren. –

Verwandte Themen