Назад к вопросам
Middle+
149
questionbank
Как предоставить разные инстансы одного и того же класса в Dagger Hilt?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech 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 // ... использование зависимостей ... } - В места, куда нужно внедрить зависимость (