Middle+
Como fornecer diferentes instâncias da mesma classe no Dagger Hilt?
sobes.tech IA
Resposta da IA
Para fornecer diferentes instâncias da mesma classe no Dagger Hilt, pode usar qualificadores (@Named ou personalizados).
-
Criação de qualificadores:
- Use
@Namedpara casos simples, indicando um nome de string. - Crie suas próprias anotações de qualificadores personalizados para cenários mais complexos ou melhor semântica.
// Exemplo de qualificador personalizado @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductionApi @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class TestApi - Use
-
Ligação de diferentes instâncias usando qualificadores:
- Em módulos
Hilt(@Module), dentro de classes com@Providesou@Binds, use anotações de qualificadores em métodos que retornam instâncias.
@Module @InstallIn(SingletonComponent::class) // Exemplo de escopo object AppModule { @Provides @Singleton // Exemplo de escopo @Named("개발") // Qualificador @Named para a instância "Para desenvolvimento" fun provideDevRepository(): Repository { return Repository("개발 환경") // Instância ou configuração diferente } @Provides @Singleton // Exemplo de escopo @Named("운영") // Qualificador @Named para a instância "Para produção" fun provideProdRepository(): Repository { return Repository("운영 환경") // Instância ou configuração diferente } // Uso de qualificadores personalizados @Provides @Singleton @ProductionApi fun provideProductionService(): MyService { return MyService("Endpoint de API de produção") } @Provides @Singleton @TestApi fun provideTestService(): MyService { return MyService("Endpoint de API de teste") } } - Em módulos
-
Injeção de instância específica:
- Nos locais onde é necessário injetar a dependência (
@AndroidEntryPoint), anote o campo ou parâmetro do construtor com o qualificador correspondente.
@AndroidEntryPoint // Por exemplo, Fragment ou Activity class MyFragment : Fragment() { @Inject @Named("개발") // Injetar a instância "Para desenvolvimento" lateinit var devRepository: Repository @Inject @Named("운영") // Injetar a instância "Para produção" lateinit var prodRepository: Repository @Inject @ProductionApi // Injetar a instância para produção com qualificadores personalizados lateinit var productionService: MyService // ... uso das dependências ... } - Nos locais onde é necessário injetar a dependência (