Sobes.tech
Middle+

Hogyan biztosíthatunk különböző példányokat ugyanabból az osztályból a Dagger Hilt-ben?

sobes.tech MI

Válasz az MI-től

A Dagger Hilt-ben ugyanazon osztály különböző példányait úgy lehet biztosítani, hogy kvalifikátorokat (@Named vagy egyedi) használunk.

  1. Kvalifikátorok létrehozása:

    • Használja az @Named-et egyszerű esetekben, megadva egy karakterlánc nevet.
    • Hozzon létre saját egyedi kvalifikátor annotációkat összetettebb forgatókönyvekhez vagy jobb szemantika érdekében.
    // Egyedi kvalifikátor példa
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Különböző példányok kötése kvalifikátorok segítségével:

    • A Hilt modulokban (@Module), osztályokon belül @Provides vagy @Binds-szel, használja a kvalifikátor annotációkat a példányokat visszaadó metódusokon.
    @Module
    @InstallIn(SingletonComponent::class) // Példa scope
    object AppModule {
    
        @Provides
        @Singleton // Scope példa
        @Named("개발") // Kvalifikátor @Named a "Fejlesztéshez" példányhoz
        fun provideDevRepository(): Repository {
            return Repository("Fejlesztési környezet") // Különböző példány vagy konfiguráció
        }
    
        @Provides
        @Singleton // Scope példa
        @Named("운영") // Kvalifikátor @Named a "Gyártáshoz" példányhoz
        fun provideProdRepository(): Repository {
            return Repository("Gyártási környezet") // Különböző példány vagy konfiguráció
        }
    
        // Egyedi kvalifikátorok használata
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Gyártási API végpont")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Teszt API végpont")
        }
    }
    
  3. Egy adott példány injektálása:

    • Az injektálni kívánt helyeken (@AndroidEntryPoint) annotálja a mezőt vagy a konstruktor paraméterét a megfelelő kvalifikátorral.
    @AndroidEntryPoint // Például Fragment vagy Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // A "Fejlesztéshez" példány injektálása
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // A "Gyártáshoz" példány injektálása
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // A gyártási példány injektálása egyedi kvalifikátorral
        lateinit var productionService: MyService
    
        // ... függőségek használata ...
    }