Pregunta

Estoy tratando de inyectar una clase en tiempo de ejecución usando una fábrica para mapear enums a los tipos de clases, pero me estoy ejecutando en un problema donde lanzará un error cuando intento inyectarlo.

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
    }
}

Básicamente, lo que estoy tratando de lograr es instantánear una estrategia basada en algunos datos que vienen en un impulso GCM.

Tengo lo siguiente registrado en un módulo.

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

¿Alguna idea de lo que está mal con mi enfoque?

Editar:

Pude lograr lo que quería con los proveedores de inyección, pero parece un poco incómodo.¿Alguna forma de evitar esto?

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();
    }
}

¿Fue útil?

Solución

Su solución original debe ser alcanzable, pero parece que probablemente esté perdiendo la definición de inyects de esas clase en su botón de empuje.Ya que está creando esos objetos usando Objectograph.get (clase) directamente y no a través de la inyección de campo o constructor, sin agregar esas clases a la daga de inactivos no puede saber que esas clases son necesarias y no creará ninguna plomería para ellos y, por lo tanto, fallaráen tiempo de ejecución.

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

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