2011-05-22 6 views

Respuesta

11

Esto parece un caso de uso para Guice MultiBinder. Usted podría tener algo así:

interface YourInterface { 
    ... 
} 

class A implements YourInterface { 
    ... 
} 

class B implements YourInterface { 
    ... 
} 

class YourModule extends AbstractModule { 
    @Override protected void configure() { 
     Multibinder.newSetBinder(YourInterface.class).addBinding().to(A.class): 
     Multibinder.newSetBinder(YourInterface.class).addBinding().to(B.class): 
    } 
} 

Y se puede inyectar un Set<YourInterface> en cualquier lugar:

class SomeClass { 
    @Inject public SomeClass(Set<YourInterface> allImplementations) { 
     ... 
    } 
} 

que debe coincidir con lo que usted necesita.

+0

Lo hace de hecho. Gracias por señalarme en la dirección correcta. –

+0

Encontrará Multibindings en un jar separado ("extensión de guice"): http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.inject.extensions%22%20AND% 20a% 3A% 22guice-multibindings% 22 – Peti

6

Guice Multibindings requieren que addBinding explícitamente() para A & B a YourInterface. Si desea una solución más "transparente" (automática) como AFAIK Spring ofrece lista para usar, suponiendo que Guice ya conoce A & B porque ya tiene un enlace para A & B en cualquier lugar, incluso si no es explícito, sino simplemente implícito, por ejemplo a través de un @Inject en otro lugar, entonces y sólo entonces, alternativamente, podría utilizar algo como esto para auto-descubrimiento (inspired by as done here, basado en accessing Guice injector in a Module):

class YourModule extends AbstractModule { 
    @Override protected void configure() { } 

    @Provides 
    @Singleton 
    SomeClass getSomeClass(Injector injector) { 
     Set<YourInterface> allYourInterfaces = new HashSet<>(); 
     for (Key<?> key : injector.getAllBindings().keySet()) { 
      if (YourInterface.class.isAssignableFrom(key.getTypeLiteral().getRawType())) { 
      YourInterface yourInterface = (YourInterface) injector.getInstance(key); 
      allYourInterfaces.add(yourInterface); 
     } 
     return new SomeClass(allYourInterfaces); 
    } 
} 

Nota de nuevo que este enfoque no requiere ningún tipo de exploración ruta de clases; simplemente mira todas las vinculaciones ya conocidas en el inyector para cualquier cosa que IS-A YourInterface.

+0

Estoy intentando lo mismo. Pero no está funcionando. http://stackoverflow.com/questions/43705146/get-all-the-instance-subclass-of-trait-using-google-guice – Sky

Cuestiones relacionadas