2017-09-03 203 views
1

我有一個Dagger模塊,它有兩個構造不同Retrofit實例的@Provides方法。我也有兩種方法需要使用Retrofit實例之一。提供兩種不同的相同類型的實例

如何告訴Dagger我想在每個消費函數中使用Retrofit

我的代碼:

@Provides 
@Singleton 
public OkHttpClient provideOkHttpClient(){ 
    final OkHttpClient.Builder builder = new OkHttpClient.Builder(); 

    if (BuildConfig.DEBUG) { 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
     builder.addInterceptor(logging); 
    } 

    builder.connectTimeout(60 * 1000, TimeUnit.MILLISECONDS) 
      .readTimeout(60 * 1000, TimeUnit.MILLISECONDS); 

    return builder.build(); 
} 

@Provides 
@Singleton 
public Retrofit provideRestAdapter1(Application application, OkHttpClient okHttpClient) { 
    Retrofit.Builder builder = new Retrofit.Builder(); 
    builder.client(okHttpClient) 
      .baseUrl(application.getString(R.string.Endpoint1)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()); 
    return builder.build(); 
} 

@Provides 
@Singleton 
public Retrofit provideRestAdapter2(Application application, OkHttpClient okHttpClient) { 
    Retrofit.Builder builder = new Retrofit.Builder(); 
    builder.client(okHttpClient) 
      .baseUrl(application.getString(R.string.Endpoint2)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()); 
    return builder.build(); 
} 

@Provides 
@Singleton 
public GithubApiService provideGithubApiService(Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService.class); 
} 

@Provides 
@Singleton 
public GithubApiService2 provideGithubApiService(Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService2.class); 
} 

} 

回答

2

您可以使用@Qualifier註解區分兩者。

首先創建一個新的註釋類型(當然它自己的Java文件):

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
public @interface EndPoint1 { 

} 

然後註釋相關@Provides方法:

@Provides 
@Singleton 
@EndPoint1 
public Retrofit provideRestAdapter1(Application application, OkHttpClient okHttpClient) { 
    ... 
} 

然後告訴改造使用這一個在其他@Provides

@Provides 
@Singleton 
public GithubApiService provideGithubApiService(@EndPoint1 Retrofit restAdapter) { 
    return restAdapter.create(GithubApiService.class); 
} 

你可以als o如果您不想創建自己的註釋,請使用@NamedSee the documentation here

1

您還可以使用名稱參數

使用此代碼

@Provides 
@Singleton 
@Named("Google") 
Retrofit providePlaceApiClient(OkHttpClient client, Gson gson) { 
    return new Retrofit.Builder() 
      .baseUrl(BaseApiConfig.getPlaceApiUrl()) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
} 

@Provides 
@Singleton 
Retrofit provideRetrofit(OkHttpClient client, Gson gson) { 
    return new Retrofit.Builder() 
      .baseUrl(BaseApiConfig.getBaseUrl()) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
} 

你可以得到注入註釋本使用命名的註釋。

@Inject 
@Named("Google") 
Retrofit retrofit 

另外,還可以對孩子的全球化志願服務青年組件上添加

@Named("Google") 
Retrofit providePlaceApiClient(); 
相關問題