Sobes.tech
Middle+

Ako poskytnúť rôzne inštancie toho istého triedy v Dagger Hilt?

sobes.tech AI

Odpoveď od AI

Pre poskytovania rôznych inštancií toho istého triedy v Dagger Hilt môžete použiť kvalifikátory (@Named alebo vlastné).

  1. Vytváranie kvalifikátorov:

    • Použite @Named pre jednoduché prípady, uvádzaním reťazcového mena.
    • Vytvárajte vlastné anotácie-kvalifikátory pre zložitejšie scenáre alebo lepšiu sémantiku.
    // Príklad vlastného kvalifikátora
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Pripájanie rôznych inštancií pomocou kvalifikátorov:

    • V moduloch Hilt (@Module), vo vnútri tried s @Provides alebo @Binds, používajte anotácie-kvalifikátory pre metódy, ktoré vracajú inštancie.
    @Module
    @InstallIn(SingletonComponent::class) // príklad scope
    object AppModule {
    
        @Provides
        @Singleton // príklad scope
        @Named("개발") // kvalifikátor @Named pre inštanciu "Pre vývoj"
        fun provideDevRepository(): Repository {
            return Repository("개발环境") // rôzna inštancia alebo konfigurácia
        }
    
        @Provides
        @Singleton // príklad scope
        @Named("운영") // kvalifikátor @Named pre inštanciu "Pre produkciu"
        fun provideProdRepository(): Repository {
            return Repository("운영环境") // rôzna inštancia alebo konfigurácia
        }
    
        // Použitie vlastných kvalifikátorov
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Production API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Vkladanie špecifickej inštancie:

    • Na miestach, kde je potrebné vložiť závislosť (@AndroidEntryPoint), anotujte pole alebo konštruktorový parameter príslušným kvalifikátorom.
    @AndroidEntryPoint // Napríklad Fragment alebo Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Vkladáme inštanciu "Pre vývoj"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Vkladáme inštanciu "Pre produkciu"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Vkladáme inštanciu pre produkciu s vlastným kvalifikátorom
        lateinit var productionService: MyService
    
        // ... použitie závislostí ...
    }