Sobes.tech
Middle+

Dagger Hilt'da bir xil sinfning turli instansiyalarini qanday ta'minlash mumkin?

sobes.tech AI

AIdan javob

Dagger Hilt'da ayni sinfning turli xil instanslarini ta'minlash uchun kvalifikatorlardan (@Named yoki maxsus) foydalanish mumkin.

  1. Kvalifikatorlarni yaratish:

    • Oddiy holatlar uchun @Named dan foydalaning va satr nomini ko'rsating.
    • Murakkabroq holatlar yoki yaxshiroq semantika uchun o'z maxsus kvalifikator anotatsiyalarini yarating.
    // Maxsus kvalifikator misoli
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Kvalifikatorlar yordamida turli instanslarni bog'lash:

    • Hilt modullarida (@Module), @Provides yoki @Binds bilan sinflar ichida, metodlar uchun kvalifikator anotatsiyalaridan foydalaning.
    @Module
    @InstallIn(SingletonComponent::class) // Kapsam misoli
    object AppModule {
    
        @Provides
        @Singleton // Kapsam misoli
        @Named("개발") // "Rivojlantirish uchun" instansiya uchun @Named kvalifikatori
        fun provideDevRepository(): Repository {
            return Repository("Rivojlantirish muhit") // Turli instansiya yoki konfiguratsiya
        }
    
        @Provides
        @Singleton // Kapsam misoli
        @Named("운영") // "Sanoat uchun" instansiya uchun @Named kvalifikatori
        fun provideProdRepository(): Repository {
            return Repository("Sanoat muhit") // Turli instansiya yoki konfiguratsiya
        }
    
        // Maxsus kvalifikatorlardan foydalanish
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Sanoat API endpoint")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API endpoint")
        }
    }
    
  3. Maxsus instansiyani injektsiya qilish:

    • Zararli joylarda (@AndroidEntryPoint) bog'lamoqchi bo'lgan joyda, maydon yoki konstruktor parametrini mos kvalifikator bilan belgilash.
    @AndroidEntryPoint // Masalan, Fragment yoki Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // "Rivojlantirish uchun" instansiyani injektsiya qilish
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // "Sanoat uchun" instansiyani injektsiya qilish
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Sanoat uchun maxsus kvalifikator bilan instansiyani injektsiya qilish
        lateinit var productionService: MyService
    
        // ... bog'lamalarni ishlatish ...
    }