Sobes.tech
Middle+

Hoe geef je verschillende instanties van dezelfde klasse in Dagger Hilt?

sobes.tech AI

Antwoord van AI

Om verschillende instanties van dezelfde klasse in Dagger Hilt te leveren, kun je kwalificaties gebruiken (@Named of aangepaste).

  1. Aanmaken van kwalificaties:

    • Gebruik @Named voor eenvoudige gevallen, met een stringnaam.
    • Maak je eigen aangepaste kwalificatie-annotaties voor complexere scenario's of betere semantiek.
    // Voorbeeld van een aangepaste kwalificatie
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Koppelen van verschillende instanties met kwalificaties:

    • In modules Hilt (@Module), binnen klassen met @Provides of @Binds, gebruik kwalificatie-annotaties voor methoden die instanties teruggeven.
    @Module
    @InstallIn(SingletonComponent::class) // Voorbeeld scope
    object AppModule {
    
        @Provides
        @Singleton // Voorbeeld scope
        @Named("개발") // Kwalificatie @Named voor de instantie "Voor ontwikkeling"
        fun provideDevRepository(): Repository {
            return Repository("Ontwikkelomgeving") // Verschillende instantie of configuratie
        }
    
        @Provides
        @Singleton // Voorbeeld scope
        @Named("운영") // Kwalificatie @Named voor de instantie "Voor productie"
        fun provideProdRepository(): Repository {
            return Repository("Productieomgeving") // Verschillende instantie of configuratie
        }
    
        // Gebruik van aangepaste kwalificaties
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Productie API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Injectie van een specifieke instantie:

    • Op plaatsen waar je afhankelijkheid moet injecteren (@AndroidEntryPoint), annoteer het veld of de constructorparameter met de juiste kwalificator.
    @AndroidEntryPoint // Bijvoorbeeld, Fragment of Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Injecteer de "Voor ontwikkeling" instantie
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Injecteer de "Voor productie" instantie
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Injecteer de instantie voor productie met aangepaste kwalificator
        lateinit var productionService: MyService
    
        // ... gebruik van afhankelijkheden ...
    }