Sobes.tech
Middle+

Wie stellt man verschiedene Instanzen derselben Klasse in Dagger Hilt bereit?

sobes.tech KI

Antwort von AI

Um eine Vielzahl von Instanzen derselben Klasse in Dagger Hilt bereitzustellen, können Sie Qualifikatoren (@Named oder benutzerdefinierte) verwenden.

  1. Erstellen von Qualifikatoren:

    • Verwenden Sie @Named für einfache Fälle, indem Sie einen String-Namen angeben.
    • Erstellen Sie Ihre eigenen benutzerdefinierten Qualifikator-Annotationen für komplexere Szenarien oder bessere Semantik.
    // Beispiel für einen benutzerdefinierten Qualifikator
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Verknüpfung verschiedener Instanzen mit Qualifikatoren:

    • In Hilt-Modulen (@Module), innerhalb von Klassen mit @Provides oder @Binds, verwenden Sie Qualifikator-Annotationen für Methoden, die Instanzen zurückgeben.
    @Module
    @InstallIn(SingletonComponent::class) // Beispiel für Scope
    object AppModule {
    
        @Provides
        @Singleton // Beispiel für Scope
        @Named("개발") // Qualifikator @Named für die Instanz "Für Entwicklung"
        fun provideDevRepository(): Repository {
            return Repository("개발 Umgebung") // Verschiedene Instanz oder Konfiguration
        }
    
        @Provides
        @Singleton // Beispiel für Scope
        @Named("운영") // Qualifikator @Named für die Instanz "Für Produktion"
        fun provideProdRepository(): Repository {
            return Repository("운영 Umgebung") // Verschiedene Instanz oder Konfiguration
        }
    
        // Verwendung benutzerdefinierter Qualifikatoren
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Production API-Endpunkt")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Test API-Endpunkt")
        }
    }
    
  3. Injektion einer spezifischen Instanz:

    • An den Stellen, an denen die Abhängigkeit injiziert werden soll (@AndroidEntryPoint), annotieren Sie das Feld oder den Konstruktorparameter mit dem entsprechenden Qualifikator.
    @AndroidEntryPoint // Zum Beispiel Fragment oder Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Injektieren der "Für Entwicklung" Instanz
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Injektieren der "Für Produktion" Instanz
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Injektieren der Instanz für Produktion mit benutzerdefiniertem Qualifikator
        lateinit var productionService: MyService
    
        // ... Verwendung der Abhängigkeiten ...
    }