Pregunta

Tengo una aplicación que contiene Sub-Aplicaciones.Me gustaría segregar la inyección de la ginebra para que cada Subpondede pueda tener instancias separadas de las mismas clases compartidas básicas.También quiero que el inyector suministre clases de algunos módulos básicos a todas las subpectativas, para que se puedan compartir las instancias de Singleton.e.g.

GIN Modules:
  Core - shared
  MetadataCache - one per sub-application
  UserProvider - one per sub-application

En Guicio Puedo hacerlo usando createChildInjector, pero no puedo ver un equivalente obvio en la ginebra.

¿Puedo lograr algo similar en la ginebra?

¿Fue útil?

Solución

Otros consejos

Resolví esto gracias al enlace dado por @abderrazlakk, pero como el enlace no está muy próximo con las instrucciones, pensé que agregaría una solución de muestra aquí también:

Los módulos de ginebra privada le permiten tener un solo nivel de inyección jerárquica, donde los tipos registrados dentro de un módulo privado solo son visibles para otras instancias creadas dentro de ese módulo. Los tipos registrados dentro de cualquier módulo no privado todavía están disponibles para todos.

Ejemplo

Tendremos algunos tipos de muestra para inyectar (e inyectar en):

public class Thing {
    private static int thingCount = 0;
    private int index;

    public Thing() {
        index = thingCount++;
    }

    public int getIndex() {
        return index;
    }
}

public class SharedThing extends Thing {
}

public class ThingOwner1 {
    private Thing thing;
    private SharedThing shared;

    @Inject
    public ThingOwner1(Thing thing, SharedThing shared) {
        this.thing = thing;
        this.shared = shared;
    }

    @Override
    public String toString() {
        return "" + this.thing.getIndex() + ":" + this.shared.getIndex();
    }
}

public class ThingOwner2 extends ThingOwner1 {
    @Inject
    public ThingOwner2(Thing thing, SharedThing shared) {
        super(thing, shared);
    }
}

Crear dos módulos privados como este (usando Hubertwer2 para el segundo):

public class MyPrivateModule1 extends PrivateGinModule {
  @Override
  protected void configure() {
    bind(Thing.class).in(Singleton.class);
    bind(ThingOwner1.class).in(Singleton.class);
  }
}

y un módulo compartido:

public class MySharedModule extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(SharedThing.class).in(Singleton.class);
    }
}

Ahora registre los dos módulos en nuestro inyector:

@GinModules({MyPrivateModule1.class, MyPrivateModule2.class, MySharedModule.class})
public interface MyGinjector extends Ginjector {
    ThingOwner1 getOwner1();
    ThingOwner2 getOwner2();
}

Finalmente podemos ver y ver que ambos instancias de la mercancía y las cosas de la mercancía tienen la misma instancia de la totalidad del módulo compartido, sino por diferentes casos de sus registros privados:

System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top