Skip to content

Instantly share code, notes, and snippets.

@mlykotom
Last active March 22, 2021 20:56
Show Gist options
  • Save mlykotom/e4c82b4cea133e00929d2f6818b75c9b to your computer and use it in GitHub Desktop.
Save mlykotom/e4c82b4cea133e00929d2f6818b75c9b to your computer and use it in GitHub Desktop.
Lock your Dagger In Gradle Modules
@Component(
dependencies = [
FeatureComponent::class
]
)
@Singleton
interface AppComponent {
@Component.Factory
interface Factory {
fun create(
featureComponent: FeatureComponent,
): AppComponent
}
}
val featureComponent = DaggerFeatureComponent.factory().create()
val appComponent = DaggerAppComponent
.factory()
.create(featureComponent)
@Component(
dependencies = [
FeatureComponentContract::class // dependency on contract
]
)
@Singleton
interface AppComponent {
@Component.Factory
interface Factory {
fun create(
featureComponent: FeatureComponentContract, // dependency on contract
): AppComponent
}
}
interface FeatureComponentContract {
val featureRepository: FeatureRepository
}
@Component(modules = [FeatureModule::class])
@FeatureScope
interface FeatureComponent : FeatureComponentContract {
@Component.Factory
interface Factory {
fun create(): FeatureComponent
}
}
@Component(modules = [FeatureModule::class])
interface FeatureComponent {
@Component.Factory
interface Factory {
fun create(): FeatureComponent
}
// explicitly specify, otherwise can't provide outside of the component
val featureRepository: FeatureRepository
}
@Module
object FeatureModule {
@Provides
fun provideLibraryManager() = LibraryManager()
}
@Module
abstract class FeatureModule {
@Binds
abstract fun bindsFeatureRepository(impl: FeatureRepositoryImpl): FeatureRepository
}
class FeatureRepository @Inject constructor(
private val libraryManager: LibraryManager
) {
fun doSomething() {
libraryManager.doSomething()
}
}
interface FeatureRepository {
fun doSomething()
}
internal class FeatureRepositoryImpl @Inject constructor() : FeatureRepository {
override fun doSomething() {
// ommitted
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment