Middle+
Dagger Hiltте бир класстын ар кандай инстанцияларын кантип камсыз кылса болот?
sobes.tech AI
AIден жооп
Dagger Hilt-те бирдей класстын ар башка инстанцияларын берүү үчүн сиз квалификаторлорду (@Named же өзгөчө түзүлгөндөрү) колдонсоңуз болот.
-
Квалификаторлорду түзүү:
- Жөнөкөй учурларда
@Namedколдонуп, жол аты көрсөтүңүз. - Көчүрмө сценарийлер же жакшы семантика үчүн өзгөчө анотациялык квалификаторлорду түзүңүз.
// Колдонуучу үчүн мисалдык квалификатор @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductionApi @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class TestApi - Жөнөкөй учурларда
-
Ар башка инстанцияларды квалификаторлор аркылуу байланыштыруу:
Hiltмодулдарында (@Module),@Providesже@Bindsкласстарынын ичинде, кайтарган инстанциялар үчүн квалификатор анотацияларын колдонуңуз.
@Module @InstallIn(SingletonComponent::class) // мисал скоуп object AppModule { @Provides @Singleton // скоуп мисалы @Named("개발") // "Өнүктүрүү үчүн" инстанция үчүн @Named квалификатору fun provideDevRepository(): Repository { return Repository("Өнүктүрүү чөйрөсү") // ар башка инстанция же конфигурация } @Provides @Singleton // скоуп мисалы @Named("운영") // "Өндүрүш үчүн" инстанция үчүн @Named квалификатору fun provideProdRepository(): Repository { return Repository("Өндүрүш чөйрөсү") // ар башка инстанция же конфигурация } // Өзгөчө квалификаторлорду колдонуу @Provides @Singleton @ProductionApi fun provideProductionService(): MyService { return MyService("Production API endpoint") } @Provides @Singleton @TestApi fun provideTestService(): MyService { return MyService("Test API endpoint") } } -
Специфик инстанцияны киргизүү:
- Киргизүү керек жерлерде (
@AndroidEntryPoint), талааны же конструктор параметрин тиешелүү квалификатор менен анотациялаңыз.
@AndroidEntryPoint // Мисалы, Fragment же Activity class MyFragment : Fragment() { @Inject @Named("개발") // "Өнүктүрүү үчүн" инстанцияны киргизүү lateinit var devRepository: Repository @Inject @Named("운영") // "Өндүрүш үчүн" инстанцияны киргизүү lateinit var prodRepository: Repository @Inject @ProductionApi // Өндүрүш үчүн инстанцияны киргизүү, өзгөчө квалификатор менен lateinit var productionService: MyService // ... көзкарандылыктарды колдонуу ... } - Киргизүү керек жерлерде (