In Dagger 2 Dependency Injection...
What is the difference between @Provides, @Binds and @Inject ?
2023-01-31 18:26:47 - Mohamad Abuzaid
-------------------------
[1] @Provides
Annotation for function creating the dependency. Can contain any arbitrary code, where you can define how the dependency should be created.
- ex: Create and inject Retrofit instance
@Module
class NetworkModule {
@Provides
fun provideRetrofit(baseUrl: String): Retrofit {
return Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}
---------------------
[2] @Binds
Just a shortcut used instead of @Provides when you want to bind an interface/abstract class to its implementation.
- It can take only a single parameter and the type return is the interface/class implemented by the given parameter object.
Note: You can’t use @Provides and @Binds methods together inn the same module class.
@Module
abstract class RepositoryModule {
@Binds abstract fun bindRepository(repository: RemoteRepository): Repository
@Binds abstract fun bindDataSource(dataSource: RemoteDataSource): DataSource
}
---------------------
[3] @Inject
Annotates the constructor of a class, if the constructor is public and all its parameters can be provided by Dagger.
class NetworkClient @Inject constructor(
private val apiService: ApiService,
private val networkInterceptor: NetworkInterceptor
) {
fun makeRequest(request: Request) {
// Make the network request using apiService and networkInterceptor objects
}
}