Sobes.tech
Middle+

Cum se furnizează diferite instanțe ale aceleiași clase în Dagger Hilt?

sobes.tech AI

Răspuns de la AI

Pentru a furniza instanțe diferite ale aceleiași clase în Dagger Hilt, puteți utiliza calificatori (@Named sau personalizați).

  1. Crearea calificatorilor:

    • Utilizați @Named pentru cazuri simple, indicând un nume de șir.
    • Creați propriile adnotări de calificatori personalizați pentru scenarii mai complexe sau o semantică mai bună.
    // Exemplu de calificator personalizat
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Legarea diferitelor instanțe folosind calificatori:

    • În modulele Hilt (@Module), în interiorul claselor cu @Provides sau @Binds, folosiți adnotări de calificatori pentru metodele care returnează instanțe.
    @Module
    @InstallIn(SingletonComponent::class) // Exemplu de scop
    object AppModule {
    
        @Provides
        @Singleton // Exemplu de scop
        @Named("개발") // Calificator @Named pentru instanța "Pentru dezvoltare"
        fun provideDevRepository(): Repository {
            return Repository("Mediu de dezvoltare") // Instanță sau configurație diferită
        }
    
        @Provides
        @Singleton // Exemplu de scop
        @Named("운영") // Calificator @Named pentru instanța "Pentru producție"
        fun provideProdRepository(): Repository {
            return Repository("Mediu de producție") // Instanță sau configurație diferită
        }
    
        // Utilizarea calificatorilor personalizați
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint API de producție")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint API de test")
        }
    }
    
  3. Injecția unei instanțe specifice:

    • În locurile unde trebuie injectată dependența (@AndroidEntryPoint), adnotați câmpul sau parametrul constructorului cu calificatorul corespunzător.
    @AndroidEntryPoint // De exemplu, Fragment sau Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Injectează instanța "Pentru dezvoltare"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Injectează instanța "Pentru producție"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Injectează instanța pentru producție cu calificator personalizat
        lateinit var productionService: MyService
    
        // ... utilizarea dependențelor ...
    }