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.
-
Kvalifikatorlarni yaratish:
- Oddiy holatlar uchun
@Nameddan 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 - Oddiy holatlar uchun
-
Kvalifikatorlar yordamida turli instanslarni bog'lash:
Hiltmodullarida (@Module),@Providesyoki@Bindsbilan 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") } } -
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 ... } - Zararli joylarda (