Conceptos básicos de Dagger

Conceptos básicos de Dagger

  1. La inyección manual de dependencias

se puede volver compleja al aumentar el tamaño del proyecto

  1. Para ayudar con la complejidad en la inyección de dependencias

podemos usar Dagger

  1. Dagger es un framework de inyección de dependencias

en tiempo de compilación

  1. No usa reflexión o generación de bycode en runtime
  1. Realiza el análisis en tiempo de compilación y genera código en Java

Beneficios de usar Dagger

  1. Generación del gráfico de dependencias,

como el realizado a mano en el proyecto anterior

  1. Creación de factorías, para las clases disponibles en el árbol de dependencias
  1. Reutilización de dependencias o creación de nuevas instancias, dependiendo del scope
  1. Creación de contenedores para flujos específicos,

esto mejora el rendimiento al liberar objetos de la memoria

  1. Dagger válida el árbol de dependencias asegurando:
  1. Que cada dependencia, puede ser satisfecha y no genere errores en runtime
  1. Verificar que no hay ciclos de dependencias o loop infinitos

Un simple caso de uso en Dagger. Crear una Factoría

  1. Acá vamos a demostrar, como podemos trabajar con dagger, para crear

una simple fabrica, para DogsRepositoy class

  1. Agregamos la etiqueta @Inject a DogsRepository class

class DogsRepository @Inject constructor(

    private val dogsLocalDataSource: DogsLocalDataSource,

    private val dogsRemoteDataSource: DogsRemoteDataSource

){

    fun getDogsByBreed(breed : String) : Call<DogsByBreedRemote> {

        return dogsRemoteDataSource.getDogsByBreed(breed)

    }

}
  1. 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```**
  1. Ahora Dagger sabe cómo crear una instancia de DogsRepository
  1. Pero no sabe cómo crear sus dependencias.
  1. 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){ ... }