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
    
        // ... използване на зависимостите ...
    }