我在我的应用程序中使用 dagger2。我有一个模块提供一些依赖项,例如 Retrofit
、Gson
等。
NetModule.java
@Module
public class NetModule {
private String mBaseUrl;
public NetModule(String baseUrl) {
this.mBaseUrl = baseUrl;
}
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
@Provides
@Singleton
Cache provideOkHttpCache(Application application) {
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(application.getCacheDir(), cacheSize);
return cache;
}
@Provides
@Singleton
Gson provideGson() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return gsonBuilder.create();
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newBuilder()
//.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.cache(cache)
.build();
return okHttpClient;
}
@Provides
@Singleton
Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(mBaseUrl)
.client(okHttpClient)
.build();
return retrofit;
}
}
NetComponent.java
@Singleton
@Component(modules = {AppModule.class, NetModule.class, Validator.class})
public interface NetComponent {
void inject(AuthenticationActivity authenticationActivity);
void inject(PaymentActivity paymentActivity);
}
AppApplication.java
@Override
public void onCreate() {
super.onCreate();
mNetComponent = DaggerNetComponent.builder()
.appModule(new AppModule(this))
.netModule(new NetModule("https://corporateapiprojectwar.mybluemix.net/corporate_banking/mybank/"))
.build();
}
这种方法一直有效,直到我的完整应用程序只有一个基本 URL。现在,我的 AuthenticationActivity
和 PaymentActivity
有不同的基本 Url,因此我无法在 onCreate
的 NetModule
构造函数中发送 Url 应用程序
任何人都可以帮助我如何使用 dagger2 添加改造的动态基本 Url。
最佳答案
您可以使用@Named
注释Dagger2 user guide (参见“资格赛”部分):
在您的NetModule.java中:
@Provides
@Singleton
@Named("authRetrofit")
public Retrofit provideAuthRetrofit() {
// setup retrofit for authentication
return retrofit;
}
@Provides
@Singleton
@Named("paymentRetrofit")
public Retrofit providePaymentRetrofit() {
// setup retrofit for payments
return retrofit;
}
在您的AuthenticationActivity
中:
@Inject
@Named("authRetrofit")
Retrofit retrofit;
最后在您的PaymentActivity.java
中:
@Inject
@Named("paymentRetrofit")
Retrofit retrofit;
然后 dagger 将自动将为支付配置的 Retrofit
注入(inject)到 PaymentActivity 中,并将为身份验证配置的 Retrofit
注入(inject)到 AuthenticationActivity
关于java - 如何使用 dagger2 在改造模块中添加动态基本 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43161887/