r01f.guids
Class GUIDDispenserGuiceModule

java.lang.Object
  extended by r01f.guids.GUIDDispenserGuiceModule
All Implemented Interfaces:
com.google.inject.Module

public class GUIDDispenserGuiceModule
extends java.lang.Object
implements com.google.inject.Module

Módulo GUICE para el GUIDDispenser IMPORTANTE! Si se implementa un nuevo tipo de dispenser es necesario añadir AQUI un nuevo binding. Funcionamiento: -------------- El GUIDDispenserManager utiliza la definición de un dispenser que está en formato XML y que se transforma a un objeto GUIDDispenserDef En la definición del dispenser se indica en la propiedad 'factoryBindingId' de qué tipo se trata: simpleGUIDDispenser desa 36 Dado que el binding se conoce en tiempo de EJECUCION (NO en tiempo de compilación), NO se puede utilizar Guice de la forma habitual ya que en tiempo de COMPILACION NO se sabe que impl del GuiceDispenser hay que mapear binder.bind(GuidDispenser.class).to(¿¿ que impl hay que cablear ??) La solución es utilizar MapBinder que permite asociar IDs a instancias, de forma que: - El mapeo sería algo como: MapBinder guidDispenserFactoryMapBinder = MapBinder.newMapBinder(binder,String.class,GUIDDispenserFactory.class); guidDispenserFactoryMapBinder.addBinding("simpleGUIDDispenser").to(SimpleGUIDDispenserFactory.class).in(Singleton.class); guidDispenserFactoryMapBinder.addBinding("highLowGUIDDispenser").to(HighLowGUIDDispenserFactory.class).in(Singleton.class); - En tiempo de EJECUCION, a partir del ID del GUIDDispenser, se puede obtener la instancia utilizando una factoría de objetos GUIDDispenser String guidDispenserImplId = "simpleGUIDDispenser"; Key> guidDispenserFactoriesMap = Key.get(new TypeLiteral>(){}); GUIDDispenserFactory factory = GuiceInjector.singleton().getInstance(guidDispenserFactoriesMap) .get(guidDispenserImplId); outDispenser = factory.createDispenser(...); ... pero esta opción requiere tener acceso al inyector de GUICE desde el GUIDDispenserManager, accediendo al singleton del mismo (lo que NO es una buena opción de diseño), y además el código es complejo, así que es mejor dejar a GUICE que inyecte el mapa de factorías de GUIDDispensers en el GUIDDispenserManager: public class GUIDDispenserManager { private final Map _guidDispensersFactories;


Constructor Summary
GUIDDispenserGuiceModule()
           
 
Method Summary
 void configure(com.google.inject.Binder binder)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

GUIDDispenserGuiceModule

public GUIDDispenserGuiceModule()
Method Detail

configure

public void configure(com.google.inject.Binder binder)
Specified by:
configure in interface com.google.inject.Module