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.
-
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 - Használja az
-
Különböző példányok kötése kvalifikátorok segítségével:
- A
Hiltmodulokban (@Module), osztályokon belül@Providesvagy@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") } } - A
-
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 ... } - Az injektálni kívánt helyeken (