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).
-
Tworzenie kwalifikatorów:
- Użyj
@Nameddla 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 - Użyj
-
Powiązanie różnych instancji z użyciem kwalifikatorów:
- W modułach
Hilt(@Module), wewnątrz klas z@Provideslub@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") } } - W modułach
-
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 ... } - W miejscach, gdzie trzeba wstrzyknąć zależność (