Sobes.tech
Middle+

Kuidas pakkuda erinevaid sama klassi instantsse Dagger Hiltis?

sobes.tech AI

Vastus AI-lt

Dagger Hilt võimaldab pakkuda erinevaid sama klassi instantsioone, kasutades kvalifikaatoreid (@Named või oma kohandatud).

  1. Kvalifikaatorite loomine:

    • Kasutage @Named lihtsate juhtude jaoks, määrates stringi nime.
    • Looge oma kohandatud annotatsioonide kvalifikaatoreid keerulisemate stsenaariumide või parema semantika jaoks.
    // Näide kasutaja kvalifikaatorist
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Erinevate instantside sidumine kvalifikaatorite abil:

    • Modulites Hilt (@Module), klassides @Provides või @Binds, kasutage kvalifikaatorite annotatsioone meetoditele, mis tagastavad instantsid.
    @Module
    @InstallIn(SingletonComponent::class) // näide skoopist
    object AppModule {
    
        @Provides
        @Singleton // skoopi näide
        @Named("개발") // kvalifikaator @Named "Arendamiseks"
        fun provideDevRepository(): Repository {
            return Repository("Arendus keskkond") // erinev instants või konfiguratsioon
        }
    
        @Provides
        @Singleton // skoopi näide
        @Named("운영") // kvalifikaator @Named "Tootmiseks"
        fun provideProdRepository(): Repository {
            return Repository("Tootmise keskkond") // erinev instants või konfiguratsioon
        }
    
        // Kasutades kohandatud kvalifikaatoreid
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Production API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Spetsiifilise instantsi sisestamine:

    • Kohtades, kus vaja sõltuvust sisestada (@AndroidEntryPoint), märgistage väli või konstruktoriparameeter vastava kvalifikaatoriga.
    @AndroidEntryPoint // Näiteks Fragment või Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Sisestame "Arendus" instantsi
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Sisestame "Tootmise" instantsi
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Sisestame tootmise instantsi kohandatud kvalifikaatoriga
        lateinit var productionService: MyService
    
        // ... sõltuvuste kasutamine ...
    }