Search code examples
androiddagger-2dagger

Dagger module depends on another module


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?


Solution

  • 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.