Question

J'essaie d'injecter une classe à l'exécution à l'aide d'une usine pour mapper Enums aux types de classe, mais je rencontre un problème dans lequel il lancera une erreur lorsque j'essaie de l'injecter.

java.lang.IllegalArgumentException: No inject registered for members/com.example.android.push.DefaultPushHandlerStrategy. You must explicitly add it to the 'injects' option in one of your modules.

public class PushFactory {
    private Map<PushType, Class<? extends PushHandlerStrategy>> classMap = new HashMap<PushType, Class<? extends PushHandlerStrategy>>();

    @Inject
    public PushFactory() {
        classMap.put(PushType.DEFAULT, DefaultPushHandlerStrategy.class);
        classMap.put(PushType.VIDEOS, VideosPushHandlerStrategy.class);
        classMap.put(PushType.MESSAGE, MessagePushHandlerStrategy.class);
    }

    public PushHandlerStrategy getPushHandlerStategy(PushType type){
        Class<? extends PushHandlerStrategy> klazz = classMap.get(type);
        if(klazz == null){
            klazz = DefaultPushHandlerStrategy.class;
        }
        ObjectGraph graph = App.getApplication().getObjectGraph();
        return graph.get(klazz); // this line throws the exception
    }
}

Fondamentalement, qu'est-ce que j'essaie de réaliser est instantirant une stratégie basée sur certaines données dans une poussée GCM.

J'ai les suivants enregistrés dans un module.

@Module(
    injects = {
        PushFactory.class,
        PushBroadcastReceiver.class
    },
    complete = false,
    library = false
)
public class PushModule {
}

Des idées Qu'est-ce qui ne va pas avec mon approche?

EDIT:

J'ai pu réaliser ce que je voulais en injectant des fournisseurs, mais cela semble un peu lourd.Toute façon autour de cela?

public class PushFactory {
    private Map<PushType, Provider<? extends  PushHandlerStrategy>> providerMap = new HashMap<PushType, Provider<? extends PushHandlerStrategy>>();

    @Inject
    public PushFactory(Provider<DefaultPushHandlerStrategy> d, Provider<VideosPushHandlerStrategy> v, Provider<MessagePushHandlerStrategy> m) {
        providerMap.put(PushType.DEFAULT, d);
        providerMap.put(PushType.VIDEOS, v);
        providerMap.put(PushType.MESSAGE, m);
    }

    public PushHandlerStrategy getPushHandlerStrategy(PushType type){
        Provider<? extends  PushHandlerStrategy> provider = providerMap.get(type);
        if(provider == null){
            provider = providerMap.get(PushType.DEFAULT);
        }

        return provider.get();
    }
}

Était-ce utile?

La solution

Votre solution originale doit être réalisable, mais il semble que vous ne manquiez probablement pas la définition d'injectation de ces classes dans votre pullmodule.Puisque vous créez ces objets à l'aide d'ObjectGraph.get (classe) directement et non par injection de champ ou de constructeur, sans ajouter ces classes à l'injectation Dagger ne peut pas savoir que ces classes sont nécessaires et ne créeront aucune plomberie pour eux et ne feront donc pas échouerau moment de l'exécution.

@Module(
    injects = {
        PushFactory.class,
        PushBroadcastReceiver.class,
        DefaultPushHandlerStrategy.class,
        VideosPushHandlerStrategy.class,
        MessagePushHandlerStrategy.class
    },
    complete = false,
    library = false
)
public class PushModule {
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top