google - java guice bind
¿Cómo usar Google Guice para crear objetos que requieren parámetros? (3)
Tal vez solo estoy ciego, pero no veo cómo usar Guice (solo para empezar) para reemplazar la new
llamada en este método:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
Para las pruebas puede haber una implementación diferente del Procesador, así que me gustaría evitar la new
llamada y, en el transcurso de eso, deshacerse de la dependencia de la implementación.
Si mi clase pudiera recordar una instancia de Procesador, podría inyectarla a través del constructor, pero como los Procesadores están diseñados para ser inmutables, necesito uno nuevo cada vez.
¿Cómo lograría eso y lograrlo con Guice (2.0)?
¿Su procesador necesita acceso a anInputValue
durante todo su ciclo de vida? Si no es así, podría pasarse el valor para la llamada de método que está utilizando, algo como:
@Inject
public MyClass(Processor processor) {
this.processor = processor;
}
public boolean myMethod(String anInputValue) {
return processor.isEnabled(anInputValue);
}
Hace tiempo que uso Guice, pero recuerdo algo llamado "inyección asistida". Le permite definir un método de fábrica donde se suministran algunos parámetros y algunos se inyectan. En lugar de inyectar el procesador, se inyecta una fábrica de procesadores, que tiene un método de fábrica que toma el parámetro anInputValue
.
Le señalo el javadoc del FactoryProvider . Creo que debería ser utilizable para usted.
Puede obtener el efecto que desea inyectando un "Proveedor", que puede solicitarse en tiempo de ejecución para que le entregue un Procesador. Los proveedores proporcionan una forma de diferir la construcción de un objeto hasta que se solicite.
Están cubiertos en los documentos de Guice here y here .
El proveedor se verá algo así como
public class ProcessorProvider implements Provider<Processor> {
public Processor get() {
// construct and return a Processor
}
}
Dado que los proveedores son construidos e inyectados por Guice, ellos mismos pueden tener bits inyectados.
Tu código se verá como
@Inject
public MyClass(ProcessorProvider processorProvider) {
this.processorProvider = processorProvider;
}
public boolean myMethod(String anInputValue) {
return processorProvider.get().isEnabled(anInputValue);
}