Sobes.tech
Middle+

Kaip suteikti skirtingas tos pačios klasės instancijas Dagger Hilt?

sobes.tech AI

Atsakymas iš AI

Dagger Hilt'e teikiant skirtingas tos pačios klasės instancijas, galite naudoti kvalifikatorius (@Named arba savo pritaikytus).

  1. Kvalifikatorių kūrimas:

    • Naudokite @Named paprastiems atvejams, nurodydami eilutės pavadinimą.
    • Kurkite savo pritaikytus anotacijų kvalifikatorius sudėtingesniems scenarijams arba geresnei semantikui.
    // Pavyzdys naudotojo kvalifikatoriaus
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Skirtingų instancijų susiejimas naudojant kvalifikatorius:

    • Moduliuose Hilt (@Module), klasėse su @Provides arba @Binds, naudokite kvalifikatorių anotacijas metodams, grąžinantiems instancijas.
    @Module
    @InstallIn(SingletonComponent::class) // pavyzdinis sritis
    object AppModule {
    
        @Provides
        @Singleton // srities pavyzdys
        @Named("개발") // kvalifikatorius @Named "Vystymui"
        fun provideDevRepository(): Repository {
            return Repository("Vystymo aplinka") // skirtinga instancija arba konfigūracija
        }
    
        @Provides
        @Singleton // srities pavyzdys
        @Named("운영") // kvalifikatorius @Named "Produkcinė"
        fun provideProdRepository(): Repository {
            return Repository("Produkcinė aplinka") // skirtinga instancija arba konfigūracija
        }
    
        // Naudojant pritaikytus kvalifikatorius
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Production API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Įdiegti specifinę instanciją:

    • Vietose, kur reikia įdiegti priklausomybę (@AndroidEntryPoint), pažymėkite lauką arba konstruktoriaus parametrą atitinkamu kvalifikatoriumi.
    @AndroidEntryPoint // Pvz., Fragmentas arba Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Įdiegti "Vystymui" instanciją
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Įdiegti "Produkcinės" instanciją
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Įdiegti instanciją produkcijai su pritaikytu kvalifikatoriumi
        lateinit var productionService: MyService
    
        // ... priklausomybių naudojimas ...
    }