HashMap de clases de reequipamiento con daga
-
21-12-2019 - |
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
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!