Sobes.tech
Middle+

Jak zapewnić różne instancje tego samego klasy w Dagger Hilt?

sobes.tech AI

Odpowiedź od AI

Aby zapewnić różne instancje tego samego klasy w Dagger Hilt, można użyć kwalifikatorów (@Named lub własnych).

  1. Tworzenie kwalifikatorów:

    • Użyj @Named dla prostych przypadków, podając nazwę łańcuchową.
    • Twórz własne adnotacje kwalifikatorów niestandardowych dla bardziej złożonych scenariuszy lub lepszej semantyki.
    // Przykład własnego kwalifikatora
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Powiązanie różnych instancji z użyciem kwalifikatorów:

    • W modułach Hilt (@Module), wewnątrz klas z @Provides lub @Binds, używaj adnotacji kwalifikatorów dla metod zwracających instancje.
    @Module
    @InstallIn(SingletonComponent::class) // Przykład zakresu
    object AppModule {
    
        @Provides
        @Singleton // Przykład zakresu
        @Named("개발") // Kwalifikator @Named dla instancji "Dla rozwoju"
        fun provideDevRepository(): Repository {
            return Repository("Środowisko deweloperskie") // Inna instancja lub konfiguracja
        }
    
        @Provides
        @Singleton // Przykład zakresu
        @Named("운영") // Kwalifikator @Named dla instancji "Dla produkcji"
        fun provideProdRepository(): Repository {
            return Repository("Środowisko produkcyjne") // Inna instancja lub konfiguracja
        }
    
        // Użycie własnych kwalifikatorów
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint API produkcyjnego")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint API testowego")
        }
    }
    
  3. Wstrzykiwanie konkretnej instancji:

    • W miejscach, gdzie trzeba wstrzyknąć zależność (@AndroidEntryPoint), oznacz pole lub parametr konstruktora odpowiednim kwalifikatorem.
    @AndroidEntryPoint // Na przykład Fragment lub Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Wstrzykuje instancję "Dla rozwoju"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Wstrzykuje instancję "Dla produkcji"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Wstrzykuje instancję dla produkcji z własnym kwalifikatorem
        lateinit var productionService: MyService
    
        // ... użycie zależności ...
    }