2016-12-28 1 views
1

Remarque: malgré le nom similaire, la réponse de Dynamically bind instances using guice ne résout pas mon problème car j'ai besoin de toutes les injections directement injectées et non dans une carte.Lier dynamiquement des instances dans Guice

J'ai un ensemble de paires de Class -> instances. Ils sont stockés dans un ClassToInstanceMap de la goyave. Je veux passer ce ClassToInstanceMap à mon Module personnalisé et passer par chaque entrée pour effectuer la liaison réelle. Comment je fais ça?

import com.google.common.collect.ImmutableClassToInstanceMap; 
import com.google.inject.AbstractModule; 
import com.google.inject.Module; 

public class InstanceModuleBuilder { 
    private final ImmutableClassToInstanceMap.Builder<Object> instancesBuilder = ImmutableClassToInstanceMap.builder(); 
    public <T> InstanceModuleBuilder bind(Class<T> type, T instance) { 
    instancesBuilder.put(type, instance); 
    return this; 
    } 
    public Module build() { 
    return new InstanceModule(instancesBuilder.build()); 
    } 
    static class InstanceModule extends AbstractModule { 
    private final ImmutableClassToInstanceMap<Object> instances; 
    InstanceModule(ImmutableClassToInstanceMap<Object> instances) { 
     this.instances = instances; 
    } 
    @Override protected void configure() { 
     for (Class<?> type : instances.keySet()) { 
     bind(type).toInstance(instances.getInstance(type)); // Line with error 
     } 
    } 
    } 
} 

Lorsque je compile le code ci-dessus, je reçois l'erreur suivante:

InstanceModuleBuilder.java:[38,52] incompatible types: inference variable T has incompatible bounds 
    equality constraints: capture#1 of ? 
    upper bounds: capture#2 of ?,java.lang.Object 

J'ai aussi essayé les liaisons suivantes:

for (Map.Entry<? extends Object,Object> e: instances.entrySet()) { 
    bind(e.getKey()).toInstance(e.getValue()); 
} 

Ou

for (Map.Entry<? extends Object,Object> e: instances.entrySet()) { 
    bind(e.getKey()).toInstance(e.getKey().cast(e.getValue())); 
} 

Mais aucune compilation.

Répondre

2

je me suis débarrassé des génériques et cela a fonctionné:

@Override protected void configure() { 
     for (Class type : instances.keySet()) { 
     bind(type).toInstance(instances.getInstance(type)); 
     } 
    }