Sobes.tech
Middle+

Come fornire istanze diverse della stessa classe in Dagger Hilt?

sobes.tech AI

Risposta dell'AI

Per fornire istanze diverse della stessa classe in Dagger Hilt, puoi usare qualificatori (@Named o personalizzati).

  1. Creazione di qualificatori:

    • Usa @Named per casi semplici, indicando un nome stringa.
    • Crea le tue annotazioni di qualificatori personalizzati per scenari più complessi o una semantica migliore.
    // Esempio di qualificatore personalizzato
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Binding di diverse istanze usando qualificatori:

    • Nei moduli Hilt (@Module), all'interno di classi con @Provides o @Binds, usa annotazioni di qualificatori per i metodi che restituiscono istanze.
    @Module
    @InstallIn(SingletonComponent::class) // Esempio di scope
    object AppModule {
    
        @Provides
        @Singleton // Esempio di scope
        @Named("개발") // Qualificatore @Named per l'istanza "Per sviluppo"
        fun provideDevRepository(): Repository {
            return Repository("Ambiente di sviluppo") // Istanza o configurazione diversa
        }
    
        @Provides
        @Singleton // Esempio di scope
        @Named("운영") // Qualificatore @Named per l'istanza "Per produzione"
        fun provideProdRepository(): Repository {
            return Repository("Ambiente di produzione") // Istanza o configurazione diversa
        }
    
        // Uso di qualificatori personalizzati
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint API di produzione")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint API di test")
        }
    }
    
  3. Iniezione di un'istanza specifica:

    • Nei punti in cui si desidera iniettare la dipendenza (@AndroidEntryPoint), annota il campo o il parametro del costruttore con il qualificatore corrispondente.
    @AndroidEntryPoint // Per esempio, Fragment o Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Inietta l'istanza "Per sviluppo"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Inietta l'istanza "Per produzione"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Inietta l'istanza per produzione con qualificatori personalizzati
        lateinit var productionService: MyService
    
        // ... utilizzo delle dipendenze ...
    }