匕首可以根据请求的类型提供不同的接口实现吗?

时间:2017-07-07 20:57:17

标签: dagger-2 dagger

我刚刚开始学习Dagger,我想知道:它可以提供不同的接口实现,具体取决于请求吗? 例如,我有一个接口Api,我有2个此接口的实现 - TwitterApiFacebookApi。我可以写下面的内容吗?

@Provides
Api provideApi(ApiType type) {
    switch (type){
        case TWITTER_API:
            return new TwitterApi();
        case FACEBOOK_API:
            return new FacebookApi();
    }
}

也许@Named()能以某种方式提供帮助吗?

1 个答案:

答案 0 :(得分:2)

这实际上取决于你想要完成的事情。您有2个基本设置,无论您是想一次访问不同的实现,还是只想提供一个。

同时/在同一范围内访问它们

这是您要使用@Qualifier的地方,例如@Named。它允许您定义2个相同类型的限定对象,因此您可以在同一模块中同时请求/使用它们。

这里你只是在你的两个实现上放置一个限定符,并且可以提供&同时请求。

@Binds
@Qualifier("twitter")
Api provideApi(TwitterApi api);

请求

@Inject @Qualifier("twitter") Api api;

在范围内使用单个

如果您有一些ApiDependentThing需要执行Api个实施,而您想要提供TwitterApiFacebookApi,则可以绑定其中一个对组件的实现。您可以通过在模块中使用@Component.Builder@Binds或其他方式来实现此目的。

使用这种方法,您不会使用限定符,因为您的图表中只有一个 Api将在您的组件中使用。

E.g。只需在构建器中绑定一个实例。

@Component
interface ApiComponent {
  Api api();

  @Component.Builder
  interface Builder {
    @BindsInstance Builder api(Api api);
    ApiComponent build();
  }
}