Sobes.tech
Middle+

Kā nodrošināt dažādas tā paša klases instances Dagger Hilt?

sobes.tech AI

Atbilde no AI

Dagger Hilt ļauj nodrošināt dažādas vienas un tās pašas klases instancijas, izmantojot kvalifikatorus (@Named vai savus pielāgotus).

  1. Kvalifikatoru izveide:

    • Izmantojiet @Named vienkāršiem gadījumiem, norādot virknes nosaukumu.
    • Izveidojiet savus pielāgotus anotāciju kvalifikatorus sarežģītākiem scenārijiem vai labākai semantikai.
    // Piemērs lietotāja kvalifikatoram
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Dažādu instanču saistīšana ar kvalifikatoru palīdzību:

    • Moduļos Hilt (@Module), iekš klasēm ar @Provides vai @Binds, izmantojiet kvalifikatoru anotācijas metodēm, kas atgriež instancēs.
    @Module
    @InstallIn(SingletonComponent::class) // piemērs sērijai
    object AppModule {
    
        @Provides
        @Singleton // sērijas piemērs
        @Named("개발") // kvalifikators @Named "Izstrādes"
        fun provideDevRepository(): Repository {
            return Repository("Izstrādes vide") // dažāda instancē vai konfigurācija
        }
    
        @Provides
        @Singleton // sērijas piemērs
        @Named("운영") // kvalifikators @Named "Ražošanai"
        fun provideProdRepository(): Repository {
            return Repository("Ražošanas vide") // dažāda instancē vai konfigurācija
        }
    
        // Pielāgotu kvalifikatoru izmantošana
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Production API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Konkrētas instancijas ievade:

    • Vietās, kur nepieciešams ievadīt atkarību (@AndroidEntryPoint), atzīmējiet lauku vai konstruktoru ar atbilstošu kvalifikatoru.
    @AndroidEntryPoint // Piemēram, Fragment vai Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Ievada "Izstrādes" instanci
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Ievada "Ražošanas" instanci
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Ievada ražošanas instanci ar pielāgotu kvalifikatoru
        lateinit var productionService: MyService
    
        // ... atkarību izmantošana ...
    }