Sobes.tech
Middle+

Dagger Hiltте бир класстын ар кандай инстанцияларын кантип камсыз кылса болот?

sobes.tech AI

AIден жооп

Dagger Hilt-те бирдей класстын ар башка инстанцияларын берүү үчүн сиз квалификаторлорду (@Named же өзгөчө түзүлгөндөрү) колдонсоңуз болот.

  1. Квалификаторлорду түзүү:

    • Жөнөкөй учурларда @Named колдонуп, жол аты көрсөтүңүз.
    • Көчүрмө сценарийлер же жакшы семантика үчүн өзгөчө анотациялык квалификаторлорду түзүңүз.
    // Колдонуучу үчүн мисалдык квалификатор
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Ар башка инстанцияларды квалификаторлор аркылуу байланыштыруу:

    • 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")
        }
    }
    
  3. Специфик инстанцияны киргизүү:

    • Киргизүү керек жерлерде (@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
    
        // ... көзкарандылыктарды колдонуу ...
    }