我刚刚开始学习Dagger,我想知道:它可以提供不同的接口实现,具体取决于请求吗?
例如,我有一个接口Api
,我有2个此接口的实现 - TwitterApi
和FacebookApi
。我可以写下面的内容吗?
@Provides
Api provideApi(ApiType type) {
switch (type){
case TWITTER_API:
return new TwitterApi();
case FACEBOOK_API:
return new FacebookApi();
}
}
也许@Named()
能以某种方式提供帮助吗?
答案 0 :(得分:2)
这实际上取决于你想要完成的事情。您有2个基本设置,无论您是想一次访问不同的实现,还是只想提供一个。
这是您要使用@Qualifier
的地方,例如@Named
。它允许您定义2个相同类型的限定对象,因此您可以在同一模块中同时请求/使用它们。
这里你只是在你的两个实现上放置一个限定符,并且可以提供&同时请求。
@Binds
@Qualifier("twitter")
Api provideApi(TwitterApi api);
请求
@Inject @Qualifier("twitter") Api api;
如果您有一些ApiDependentThing
需要执行Api
个实施,而您想要提供TwitterApi
或FacebookApi
,则可以绑定其中一个对组件的实现。您可以通过在模块中使用@Component.Builder
或@Binds
或其他方式来实现此目的。
使用这种方法,您不会使用限定符,因为您的图表中只有一个 Api
将在您的组件中使用。
E.g。只需在构建器中绑定一个实例。
@Component
interface ApiComponent {
Api api();
@Component.Builder
interface Builder {
@BindsInstance Builder api(Api api);
ApiComponent build();
}
}