Middle+
Cum se furnizează diferite instanțe ale aceleiași clase în Dagger Hilt?
sobes.tech AI
Răspuns de la AI
Pentru a furniza instanțe diferite ale aceleiași clase în Dagger Hilt, puteți utiliza calificatori (@Named sau personalizați).
-
Crearea calificatorilor:
- Utilizați
@Namedpentru cazuri simple, indicând un nume de șir. - Creați propriile adnotări de calificatori personalizați pentru scenarii mai complexe sau o semantică mai bună.
// Exemplu de calificator personalizat @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductionApi @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class TestApi - Utilizați
-
Legarea diferitelor instanțe folosind calificatori:
- În modulele
Hilt(@Module), în interiorul claselor cu@Providessau@Binds, folosiți adnotări de calificatori pentru metodele care returnează instanțe.
@Module @InstallIn(SingletonComponent::class) // Exemplu de scop object AppModule { @Provides @Singleton // Exemplu de scop @Named("개발") // Calificator @Named pentru instanța "Pentru dezvoltare" fun provideDevRepository(): Repository { return Repository("Mediu de dezvoltare") // Instanță sau configurație diferită } @Provides @Singleton // Exemplu de scop @Named("운영") // Calificator @Named pentru instanța "Pentru producție" fun provideProdRepository(): Repository { return Repository("Mediu de producție") // Instanță sau configurație diferită } // Utilizarea calificatorilor personalizați @Provides @Singleton @ProductionApi fun provideProductionService(): MyService { return MyService("Endpoint API de producție") } @Provides @Singleton @TestApi fun provideTestService(): MyService { return MyService("Endpoint API de test") } } - În modulele
-
Injecția unei instanțe specifice:
- În locurile unde trebuie injectată dependența (
@AndroidEntryPoint), adnotați câmpul sau parametrul constructorului cu calificatorul corespunzător.
@AndroidEntryPoint // De exemplu, Fragment sau Activity class MyFragment : Fragment() { @Inject @Named("개발") // Injectează instanța "Pentru dezvoltare" lateinit var devRepository: Repository @Inject @Named("운영") // Injectează instanța "Pentru producție" lateinit var prodRepository: Repository @Inject @ProductionApi // Injectează instanța pentru producție cu calificator personalizat lateinit var productionService: MyService // ... utilizarea dependențelor ... } - În locurile unde trebuie injectată dependența (