2016-08-09 11 views
0

Ich habe die folgende Schnittstelle:Wie installiert man automatisch alle Implementierungen einer Schnittstelle mit guice?

public interface IFilterFactory<T extends IFilter> { 
    T create(IFilterConfig config); 
} 

Und mehrere Implementierungen davon:

public class AndFilter implements IFilter { 
    public interface IAndFilterFactory extends IFilterFactory<AndFilter> {} 

    // ... 
} 

public class OrFilter implements IFilter { 
    public interface IOrFilterFactory extends IFilterFactory<OrFilter> {} 

    // ... 
} 

in meinem Guice Modul, bin ich zur Zeit jedes Modul zu installieren füge ich auf diese Weise:

install(new FactoryModuleBuilder().build(IAndFilterFactory.class)); 
install(new FactoryModuleBuilder().build(IOrFilterFactory.class)); 

Die And und Or Filter sind nur Beispiele, aber ich habe viele mehr, einige davon erfordern bestimmte Objekte zu sein injiziert, also die Fabriken.

Gibt es einen Weg mit Guice, einfach zu sagen "Installiere alle Implementierungen von IFilterFactory", ohne selbst Reflektionen verwenden zu müssen?

Antwort

0

Es gibt nothing for classpath scanning built-in, und trotz a lot of existing library options gibt es Grund zu der Annahme, dass a perfect solution simply can't exist for Java. In jedem Fall ist die Aufzählung aller verfügbaren Klassen known to be slow selbst in stark ausgelasteten Bibliotheken, und eine solche Lösung würde mit der Anzahl der Klassen in Ihrer Anwendung skalieren und nicht mit der Anzahl der verwendeten Filter.

(Um es klar zu sagen, Sie fragen nicht wirklich "alle Implementierungen von IFilterFactory installieren", Sie fragen "erstellen und installieren Sie ein Modul mit FactoryModuleBuilder für alle Implementierungen von IFilterFactory". Die Factory-Schnittstelle Implementierung doesn ' t existieren, bis Sie es mit FactoryModuleBuilder erzeugen)

können Sie jedoch alles extrahieren neben dem Klassennamen selbst, so dass Sie nur eine haben einfach zu pflegen Liste der Klassen zu binden.

List<Class<?>> filterFactories = ImmutableList.<Class<?>>of(
    IAndFilterFactory.class, 
    IOrFilterFactory.class, 
    IXorFilterFactory.class, 
    HelpIAmTrappedInAFilterFactory.class 
); 
for (Class<?> clazz : filterFactories) { 
    install(new FactoryModuleBuilder().build(clazz)); 
} 
Verwandte Themen