Middle+
Как да предоставите различни инстанции на същия клас в Dagger Hilt?
sobes.tech AI
Отговор от 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 // ... използване на зависимостите ... } - В местата, където трябва да се внедри зависимост (