Sobes.tech
Middle+

¿Cómo proporcionar diferentes instancias de la misma clase en Dagger Hilt?

sobes.tech AI

Respuesta de la IA

Para proporcionar diferentes instancias de la misma clase en Dagger Hilt, se pueden usar calificadores (@Named o personalizados).

  1. Crear calificadores:

    • Usa @Named para casos simples, indicando un nombre de cadena.
    • Crea tus propias anotaciones de calificadores personalizados para escenarios más complejos o mejor semántica.
    // Ejemplo de calificadores personalizados
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Enlace de diferentes instancias usando calificadores:

    • En módulos Hilt (@Module), dentro de clases con @Provides o @Binds, usa anotaciones de calificadores en métodos que devuelven instancias.
    @Module
    @InstallIn(SingletonComponent::class) // Ejemplo de alcance
    object AppModule {
    
        @Provides
        @Singleton // Ejemplo de alcance
        @Named("개발") // Calificador @Named para la instancia "Para desarrollo"
        fun provideDevRepository(): Repository {
            return Repository("개발 환경") // Instancia o configuración diferente
        }
    
        @Provides
        @Singleton // Ejemplo de alcance
        @Named("운영") // Calificador @Named para la instancia "Para producción"
        fun provideProdRepository(): Repository {
            return Repository("운영 환경") // Instancia o configuración diferente
        }
    
        // Uso de calificadores personalizados
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint de API de producción")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint de API de prueba")
        }
    }
    
  3. Inyección de instancia específica:

    • En lugares donde se necesita inyectar la dependencia (@AndroidEntryPoint), anota el campo o parámetro del constructor con el calificador correspondiente.
    @AndroidEntryPoint // Por ejemplo, Fragment o Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Inyecta la instancia "Para desarrollo"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Inyecta la instancia "Para producción"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Inyecta la instancia para producción con calificadores personalizados
        lateinit var productionService: MyService
    
        // ... uso de las dependencias ...
    }