Назад к вопросам
Middle+
149
questionbank

Как предоставить разные инстансы одного и того же класса в Dagger Hilt?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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