Pregunta

Soy un poco nuevo a la inyección de dependencia y tengo una duda. En mi aplicación, tengo un hashmap para almacenar clases construidas (como un caché) para una reefit, pero ahora me estoy mudando a DI con Daga y me gustaría saber cómo puedo lograr el mismo comportamiento.

Mi código:

private Map<String, Object> restInstances;
public <T> T getRestClient(Class<T> clazz) {
        T client = null;

        if ((client = (T) restInstances.get(clazz.getCanonicalName())) != null) {
            return client;
        }

        client = restAdapter.create(clazz);
        restInstances.put(clazz.getCanonicalName(), client);
        return client;
    }

Después de comenzar con DI, mi clase "Módulo":

 @Provides @Singleton
    public JobManager providesJobManager(){
        Configuration config = new Configuration.Builder(app)
                .minConsumerCount(1).maxConsumerCount(3).loadFactor(3).customLogger(new CustomLogger() {
                    private static final String TAG = "JOBS";

                    @Override
                    public boolean isDebugEnabled() {
                        return true;
                    }

                    @Override
                    public void d(String text, Object... args) {
                        Log.d(TAG, String.format(text, args));
                    }

                    @Override
                    public void e(Throwable t, String text, Object... args) {
                        Log.e(TAG, String.format(text, args));
                    }

                    @Override
                    public void e(String text, Object... args) {
                        Log.e(TAG, String.format(text, args));
                    }
                })
                .consumerKeepAlive(120).build();

        return new JobManager(app, config);
    }

    @Provides @Singleton
    public RestAdapter providesRestAdapter()
    {
        restInstances = new HashMap<String, Object>();
        return new RestAdapter.Builder()
                .setEndpoint("http://192.168.0.23:9000/api")
                .setLogLevel(RestAdapter.LogLevel.FULL).build();
    }

Entonces, ¿cómo puedo inyectar este hash "caché" a mi aplicación?

gracias

¿Fue útil?

Solución

Podría crear una clase que su único propósito sería proporcionar clases de interfaz de descanso. Aquí está la interfaz / implementación

public interface RestApiProvider {
    public <T> T getRestClient(Class<T> clazz);
}

public class RestApiProviderImpl implements RestApiProvider {
    private Map<String, Object> restInstances = new HashMap<String, Object>();
    private RestAdapter restAdapter;

    @Inject
    RestApiProvider(RestAdapter restAdapter) {
        this.restAdapter = restAdapter;
    }

    public <T> T getRestClient(Class<T> clazz) {
        T client = null;

        if ((client = (T) restInstances.get(clazz.getCanonicalName())) != null) {
            return client;
        }

        client = restAdapter.create(clazz);
        restInstances.put(clazz.getCanonicalName(), client);
        return client;
    }

}

en su módulo que tendría

@Provides @Singleton
public RestAdapter providesRestAdapter()
{
    return new RestAdapter.Builder()
            .setEndpoint("http://192.168.0.23:9000/api")
            .setLogLevel(RestAdapter.LogLevel.FULL).build();
}

@Provides @Singleton
public RestApiProvider providesRestApiProvider(RestApiProviderImpl impl) {
    return impl;
}

La forma en que funciona este funciona es el proveedor de reestadapter de su módulo se utilizaría como dependencia en su instancia de RestapiProViderImpl. Ahora, en cualquier lugar, tendría que obtener una instancia de clase de Restapi, simplemente necesitaría inyectar su RestapiProvider.

@Inject
RestApiProvider restApiProvider;

// Somewhere in your code
RestApiClassOfSomeSort instance = restApiProvider.getRestClient(RestApiClassOfSomeSort.class);
instance.// do what you need!

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