Reputation: 7089
I'm new to DI and Dagger.
I have this dependency graph in the Android project:
@Module(includes=[Module1, Module2, Module3]) ClassAModule
@Module(includes=[classAModule, Module4]) ClassBModule
@Module(includes=[ClassBModule]) ClassCModule
@Module(includes=[ClassBModule]) ClassDModule
Here's how Module3
looks like
@Module
class Module3 {
@Provides
fun provideUrl(): Url{
return ...
}
}
Module3
's Url is required by ClassAModule
,
But I want ClassCModule
and ClassDModule
to be able to provide different Url to ClassAModule
how should I approach this?
Upvotes: 1
Views: 836
Reputation: 2733
To get specific url for any module, you need to define annotation on provider method.
Example
@Provides
@Room
fun provideRoomWordDataSource(): WordDataSource {
return RoomWordDataSource()
}
@Provides
@Firestore
fun provideFirestoreWordDataSource(): WordDataSource {
return FirestoreWordDataSource()
}
@Singleton
class WordRepository
@Inject constructor(
@Room private val room: WordDataSource,
@Firestore private val firestore: WordDataSource
) : Repository<String, Word>(rx, rm), WordDataSource {
}
First two provider method has define WordDataSource instance of two difference class and define with two different annotation @Room and @Firestore.
To get two different WordDataSource in WordRepository, have just used @Room and @Firestore annotation in its constructor.
Enjoy the annotation power in Dagger. :) Please feel free, if you need more details from me.
Upvotes: 1