Una pregunta sobre Guice. Todavía lo estoy aprendiendo, pero puedo entender los fundamentos.Guice runtime dependency parameters reinjection
Esta pregunta ya fue formulada un par de veces en la red, pero nunca con una respuesta concreta (ninguna que pude encontrar).
Digamos que tengo una situación similar a la de la imagen (un ejemplo similar fue algún que otro en la red).
public class Dog {}
public class Walk implements Walkable {
private final Dog dog;
private final boolean leash;
@Inject
public Walk(Dog dog, @Assisted boolean leash) {
this.dog = dog;
this.leash = leash;
}
public void go() {
}
}
public interface Walkable {
void go();
}
public interface WalkFactory {
Walk create(boolean leash);
}
public class AssistedMain {
public static void main(String[] args) {
Injector i = Guice.createInjector(new AbstractModule() {
protected void configure() {
install(new FactoryModuleBuilder().
implement(Walkable.class, Walk.class).
build(WalkFactory.class));
}
});
Walk walk = i.getInstance(WalkFactory.class).create(true);
}
}
Eso es todo muy bien. Pero la pregunta es: ¿puedo, de alguna manera, reinyectar esa instancia de objeto al "contenedor" (inyector) para usar en las clases que dependen de esta dependencia?
Entonces, permite agregar un interface Person
, class PersonImpl
.
La nueva fuente de clases son:
public interface Person {
void walkDog();
}
public class PersonImpl implements Person {
private Walkable walkable;
@Inject
public PersonImpl(Walkable walkable) {
this.walkable = walkable;
}
public void setWalkable(Walkable walkable) {
this.walkable = walkable;
}
public void walkDog() {
walkable.go();
}
}
Entonces, la pregunta es - soy yo, de alguna manera capaz de inyectar en realidad este caso particular en el objeto añadido. Este es un ejemplo simple, pero podemos suponer que hay 10 niveles de clases debajo de este.
La solución que encontré no es muy flexible. Algo así como:
Injector i = Guice.createInjector(new SimpleModule(false, dog));
Y luego unirse a instancia concreta. Eso no es muy dinámico. Básicamente, cada vez que necesito un tiempo de ejecución/parámetro dinámico diferente, tengo que volver a crear el inyector.
El Provider<T>
es bueno, el FactoryModuleBuilder
ayuda, pero ¿cómo puedo inyectar los objetos?
¿Hay soluciones más dinámicas a este problema?
Gracias.
tiene sentido para mí. – mpierce