Conceptos básicos de Dagger
Conceptos básicos de Dagger
- La inyección manual de dependencias
se puede volver compleja al aumentar el tamaño del proyecto
- Para ayudar con la complejidad en la inyección de dependencias
podemos usar Dagger
- Dagger es un framework de inyección de dependencias
en tiempo de compilación
- No usa reflexión o generación de bycode en runtime
- Realiza el análisis en tiempo de compilación y genera código en Java
Beneficios de usar Dagger
- Generación del gráfico de dependencias,
como el realizado a mano en el proyecto anterior
- Creación de factorías, para las clases disponibles en el árbol de dependencias
- Reutilización de dependencias o creación de nuevas instancias, dependiendo del scope
- Creación de contenedores para flujos específicos,
esto mejora el rendimiento al liberar objetos de la memoria
- Dagger válida el árbol de dependencias asegurando:
- Que cada dependencia, puede ser satisfecha y no genere errores en runtime
- Verificar que no hay ciclos de dependencias o loop infinitos
Un simple caso de uso en Dagger. Crear una Factoría
- Acá vamos a demostrar, como podemos trabajar con dagger, para crear
una simple fabrica, para DogsRepositoy class
- Agregamos la etiqueta
@Inject
aDogsRepository
class
class DogsRepository @Inject constructor(
private val dogsLocalDataSource: DogsLocalDataSource,
private val dogsRemoteDataSource: DogsRemoteDataSource
){
fun getDogsByBreed(breed : String) : Call<DogsByBreedRemote> {
return dogsRemoteDataSource.getDogsByBreed(breed)
}
}
- Acá le estamos diciendo a Dagger :
1. Como crear la instancia de **```DogsRepository```**, con la anotación **```@Inject```**
2. Cuales son sus dependencias : En este caso **```DogsLocalDataSource```** y **```DogsRemoteDataSource```**
- Ahora Dagger sabe cómo crear una instancia de
DogsRepository
- Pero no sabe cómo crear sus dependencias.
Si se anotan también las otras clases también,
Dagger sabrá cómo crearlas:
class DogsLocalDataSource @Inject constructor()
class DogsRemoteDataSource
@Inject constructor(private val apiService: DogsApiService){ ... }