Middle+
Comment fournir différentes instances d'une même classe dans Dagger Hilt?
sobes.tech IA
Réponse de l'IA
Pour fournir différentes instances de la même classe dans Dagger Hilt, vous pouvez utiliser des qualificatifs (@Named ou personnalisés).
-
Création de qualificatifs :
- Utilisez
@Namedpour des cas simples, en indiquant un nom de chaîne. - Créez vos propres annotations de qualificatifs personnalisés pour des scénarios plus complexes ou une meilleure sémantique.
// Exemple de qualificatif personnalisé @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductionApi @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class TestApi - Utilisez
-
Liaison de différentes instances en utilisant des qualificatifs :
- Dans les modules
Hilt(@Module), à l'intérieur des classes avec@Providesou@Binds, utilisez des annotations de qualificatifs pour les méthodes retournant des instances.
@Module @InstallIn(SingletonComponent::class) // Exemple de portée object AppModule { @Provides @Singleton // Exemple de portée @Named("개발") // Qualificatif @Named pour l'instance "Pour développement" fun provideDevRepository(): Repository { return Repository("개발 환경") // Instance ou configuration différente } @Provides @Singleton // Exemple de portée @Named("운영") // Qualificatif @Named pour l'instance "Pour production" fun provideProdRepository(): Repository { return Repository("운영 환경") // Instance ou configuration différente } // Utilisation de qualificatifs personnalisés @Provides @Singleton @ProductionApi fun provideProductionService(): MyService { return MyService("Point de terminaison API de production") } @Provides @Singleton @TestApi fun provideTestService(): MyService { return MyService("Point de terminaison API de test") } } - Dans les modules
-
Injection d'une instance spécifique :
- Dans les endroits où il faut injecter la dépendance (
@AndroidEntryPoint), annotez le champ ou le paramètre du constructeur avec le qualificatif correspondant.
@AndroidEntryPoint // Par exemple, Fragment ou Activity class MyFragment : Fragment() { @Inject @Named("개발") // Injection de l'instance "Pour développement" lateinit var devRepository: Repository @Inject @Named("운영") // Injection de l'instance "Pour production" lateinit var prodRepository: Repository @Inject @ProductionApi // Injection de l'instance pour la production avec qualificateurs personnalisés lateinit var productionService: MyService // ... utilisation des dépendances ... } - Dans les endroits où il faut injecter la dépendance (