dumbfingers
dumbfingers

Reputation: 7089

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?

Upvotes: 1

Views: 836

Answers (1)

Roman
Roman

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

Related Questions