Sobes.tech
Middle+

Kako obezbediti različite instance iste klase u Dagger Hilt?

sobes.tech АИ

Одговор од АИ

За пружање различитих инстанци истог класа у 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
    
        // ... коришћење зависности ...
    }