Sobes.tech
Middle+

Jak poskytnout různé instance stejné třídy v Dagger Hilt?

sobes.tech AI

Odpověď od AI

Pro poskytování různých instancí stejné třídy v Dagger Hilt lze použít kvalifikátory (@Named nebo vlastní).

  1. Vytvoření kvalifikátorů:

    • Použijte @Named pro jednoduché případy, s uvedením řetězcového jména.
    • Vytvořte vlastní anotace kvalifikátorů pro složitější scénáře nebo lepší sémantiku.
    // Příklad vlastního kvalifikátoru
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Vazba různých instancí pomocí kvalifikátorů:

    • V modulech Hilt (@Module), uvnitř tříd s @Provides nebo @Binds, používejte anotace kvalifikátorů pro metody vracející instance.
    @Module
    @InstallIn(SingletonComponent::class) // Příklad scope
    object AppModule {
    
        @Provides
        @Singleton // Příklad scope
        @Named("개발") // Kvalifikátor @Named pro instanci "Pro vývoj"
        fun provideDevRepository(): Repository {
            return Repository("Vývojové prostředí") // Různá instance nebo konfigurace
        }
    
        @Provides
        @Singleton // Příklad scope
        @Named("운영") // Kvalifikátor @Named pro instanci "Pro produkci"
        fun provideProdRepository(): Repository {
            return Repository("Produkční prostředí") // Různá instance nebo konfigurace
        }
    
        // Použití vlastních kvalifikátorů
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Endpoint API pro produkci")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Endpoint API pro testování")
        }
    }
    
  3. Injekce specifické instance:

    • Na místech, kde je potřeba injektovat závislost (@AndroidEntryPoint), označte pole nebo parametr konstruktoru odpovídajícím kvalifikátorem.
    @AndroidEntryPoint // Například Fragment nebo Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Injektuje instanci "Pro vývoj"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Injektuje instanci "Pro produkci"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Injektuje instanci pro produkci s vlastním kvalifikátorem
        lateinit var productionService: MyService
    
        // ... použití závislostí ...
    }