Inyección de dependencias en Android con Dagger Hilt

Pizza edition 🍕

Carlos Arboleda

https://carlosarboleda.co

GDG Cali

Icons made by Pixel perfect from Flaticon

@cfarboleda

  • Senior Developer en Patagonian
  • Co-Fundador & Ex CTO LaManicurista
  • Co-Fundador & CTO MobileLab
  • Organizador del GDG Cali
  • Android & Backend Developer

GDG Cali

Carlos Fernando Arboleda Garcés

GDG Cali

Cómo gestionas las dependencias en tu proyectos?

  1. No hay dependencias, todo en una clase
  2. Crear las dependencias dentro de la clase
  3. Pasar la instancia a una dependencia concreta
  4. Pasar la instancia a una dependencia abstracta
  5. Contenedor de dependencias manual
  6. Usar una librería de inyección de dependencias

Nivel de experiencia

GDG Cali

Conceptualización

https://developer.android.com/jetpack/guide#recommended-app-arch

Arquitectura recomendada para aplicaciones Android

GDG Cali

Conceptualización

Iconos diseñados por Freepik

1. Inversión de control

2. Inversión de dependencias

3. Inyencción de dependencias

data class Harina(){
  var store = Carulla()
}
data class Harina(
  var store: Carulla
)
data class Harina(
  var store: Carulla
)
data class Harina(
  var store: Store
)

GDG Cali

Diagrama de clases del ejemplo

Pizza

Masa

Ingredientes

Harina

Agua

Aceite

Sal

Levadura

Salsa

Jamón

Piña

Queso

Peperoni

Collection

Creando dependencias manualmente

GDG Cali

val masa = Masa(
	Harina(500),
	Sal(10),
	Levadura(20),
	Aceite(50),
	Agua(300)
)
val ingredients: List<Ingredient> = listOf(
	Salsa(200),
	Pina(400),
	Jamon(30),
	Queso(300),
)

val pizza = Pizza("Hawaiana", masa, ingredients)

Creando dependencias manualmente

GDG Cali

const api = new Api(new AxiosRequestClient());
const authSpotify = new AuthSpotify(api);
const authUseCase = new AuthUseCase(authSpotify);
const getAllAlbumsByArtistIdSpotify = new GetAllAlbumsByArtistIdSpotify(api);
const getAllAlbumsByArtistIdUseCase = new GetAllAlbumsByArtistIdUseCase(
  getAllAlbumsByArtistIdSpotify
);
const getSongsByAlbumIdSpotify = new GetSongsByAlbumIdSpotify(api);
const getSongsByAlbumIdUseCase = new GetSongsByAlbumIdUseCase(
  getSongsByAlbumIdSpotify
);
const deleteAllSongsMongodb = new DeleteAllSongsMongodb(database);
const deleteAllSongsUseCase = new DeleteAllSongsUseCase(deleteAllSongsMongodb);

const repository = new SaveSongsMongodb(database);
const useCase = new PopulateUseCase(
  repository, authUseCase, getAllAlbumsByArtistIdUseCase,
  getSongsByAlbumIdUseCase, deleteAllSongsUseCase
);

await useCase.exec(...);

Inyectando dependencias mediante un contenedor de dependencias

GDG Cali

Dagger ¬

Dagger Hilt ¬

Koin

👑

Qué es Dagger Hilt?

GDG Cali

Es una librería de inyección de dependencias construida sobre Dagger que provee una forma estándar para incluir Dagger en una aplicación Android

https://developer.android.com/training/dependency-injection/hilt-android#hilt-and-dagger

Por qué nace Dagger Hilt?

GDG Cali

  • Alta complejidad de configuración de Dagger
  • Falta de estandarización para el uso de Dagger en Android

Qué ventajas ofrece Dagger Hilt?

GDG Cali

  • Reduce la duplicidad de código
  • Dependencias de compilación desacopladas
  • Configuración simplificada
  • Testing mejorado
  • Componentes estandarizados

Dagger Hilt core API

GDG Cali

https://dagger.dev/hilt/components

Components and scopes

Dagger Hilt core API

GDG Cali

https://dagger.dev/hilt/components

Otras anotaciones importantes

  • @HiltAndroidApp
  • @Module and @InstallIn
    • @Provides and @Named
  • @AndroidEntryPoint
    • @Inject and @Named
  • @HiltViewModel

A codear...

GDG Cali

GDG Cali

Conclusiones

  • Principios SOLID y patrones de diseño relacionados
  • Conceptos acerca de inyección de dependencias
  • Components de Dagger Hilt
  • Configuración e implementación de Dagger Hilt

GDG Cali

Referencias

@cfarboleda

Inyección de dependencias en Android con Dagger Hilt - Pizza edition

By Carlos Fernando Arboleda Garces

Inyección de dependencias en Android con Dagger Hilt - Pizza edition

Cuando hablamos de aplicaciones escalables y tolerantes al cambio no podemos evitar tener en cuenta la inyección de dependencias, puesto que es uno de los elementos fundamentales cuando queremos respetar las responsabilidades de las entidades sin enloquecer mientras manejamos manualmente las dependencias

  • 573