My setup is like this
interface ServiceProvider {...}
@Singleton
class ServiceProviderImpl implements ServiceProvider {...}
class ServiceConsumer {
@Inject
ServiceConsumer(ServiceProvider prov) {...}
}
Unfortunately, this doesn't work as it claims there are no providers for ServiceProvider
, even though there is one for subclass ServiceProviderImpl
.
I get
error: [Dagger/MissingBinding] c.b.d.s.ServiceProvider cannot be provided without an @Provides-annotated method.
I can fix this by adding the following to the module
@Provides
@Singleton
ServiceProvider serviceProvider(ServiceProviderImpl impl) {return impl;}
Is this by design, or am I doing something wrong?
This is by design. Dagger makes no assumptions about what implementation of an interface to use without you specifying it somewhere.
For binding an implementation for an interface you should use @Binds
, though, which is an optimized version of @Provides
for implementation -> interface bindings.
@Binds
@Singleton
ServiceProvider serviceProvider(ServiceProviderImpl impl);