Middle+
Come fornire istanze diverse della stessa classe in Dagger Hilt?
sobes.tech AI
Risposta dell'AI
Per fornire istanze diverse della stessa classe in Dagger Hilt, puoi usare qualificatori (@Named o personalizzati).
-
Creazione di qualificatori:
- Usa
@Namedper casi semplici, indicando un nome stringa. - Crea le tue annotazioni di qualificatori personalizzati per scenari più complessi o una semantica migliore.
// Esempio di qualificatore personalizzato @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductionApi @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class TestApi - Usa
-
Binding di diverse istanze usando qualificatori:
- Nei moduli
Hilt(@Module), all'interno di classi con@Provideso@Binds, usa annotazioni di qualificatori per i metodi che restituiscono istanze.
@Module @InstallIn(SingletonComponent::class) // Esempio di scope object AppModule { @Provides @Singleton // Esempio di scope @Named("개발") // Qualificatore @Named per l'istanza "Per sviluppo" fun provideDevRepository(): Repository { return Repository("Ambiente di sviluppo") // Istanza o configurazione diversa } @Provides @Singleton // Esempio di scope @Named("운영") // Qualificatore @Named per l'istanza "Per produzione" fun provideProdRepository(): Repository { return Repository("Ambiente di produzione") // Istanza o configurazione diversa } // Uso di qualificatori personalizzati @Provides @Singleton @ProductionApi fun provideProductionService(): MyService { return MyService("Endpoint API di produzione") } @Provides @Singleton @TestApi fun provideTestService(): MyService { return MyService("Endpoint API di test") } } - Nei moduli
-
Iniezione di un'istanza specifica:
- Nei punti in cui si desidera iniettare la dipendenza (
@AndroidEntryPoint), annota il campo o il parametro del costruttore con il qualificatore corrispondente.
@AndroidEntryPoint // Per esempio, Fragment o Activity class MyFragment : Fragment() { @Inject @Named("개발") // Inietta l'istanza "Per sviluppo" lateinit var devRepository: Repository @Inject @Named("운영") // Inietta l'istanza "Per produzione" lateinit var prodRepository: Repository @Inject @ProductionApi // Inietta l'istanza per produzione con qualificatori personalizzati lateinit var productionService: MyService // ... utilizzo delle dipendenze ... } - Nei punti in cui si desidera iniettare la dipendenza (