Java Dagger2使用不同的URL构建了多个改型实例,用于使用构造函数注入攻击不同的API
我一直坚持使用mvp完成Dagger2改造2的实现,我的应用程序在各自的片段中调用两个不同的API。 我已经定义了限定符注释来为每个Api调用绑定一个改型实例,如下所示Java Dagger2使用不同的URL构建了多个改型实例,用于使用构造函数注入攻击不同的API,java,android,retrofit2,mvp,dagger-2,Java,Android,Retrofit2,Mvp,Dagger 2,我一直坚持使用mvp完成Dagger2改造2的实现,我的应用程序在各自的片段中调用两个不同的API。 我已经定义了限定符注释来为每个Api调用绑定一个改型实例,如下所示 @Qualifier @Retention(RUNTIME) public @interface FirstApi{} @Qualifier @Retention(RUNTIME) public @interface SecondApi{} 在ApplicationModule中绑定每个改装 public class App
@Qualifier
@Retention(RUNTIME)
public @interface FirstApi{}
@Qualifier
@Retention(RUNTIME)
public @interface SecondApi{}
在ApplicationModule中绑定每个改装
public class ApplicationModule {
private String mBaseUrlFirstApi;
private String mBaseUrlSecondApi;
private Context mContext;
public ApplicationModule(Context context) {
mContext = context;
}
...
@Provides
@FirstApi Retrofit provideFirstApiRetrofit(…) {…}
@Provides
@SecondApi Retrofit provideSecondApiRetrofit(…) {…}
....
}
应用组件
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Retrofit exposeRetrofit();
Context exposeContext();
}
范围
提供养蜂服务
@Module
public class MyModule {
@PerActivity
@Provides
MyAPIService myApiService(Retrofit retrofit) {
return retrofit.create(MyAPIService.class);
}
}
匕首注射器类
@PerActivity
@Component(modules = MyModule.class, dependencies = ApplicationComponent.class)
public interface MyComponent {
void inject(Fragment1 fragment1);
void inject(Fragment2 fragment2);
// void inject(Fragment3 fragment3);
}
在应用程序类中,对于单个改装Api调用,我知道要执行以下操作:
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
但对于多个url api调用,这不起作用
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.applicationModule(new ApplicationModule(this, "http://api2"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
这也不是
public class MyApplication extends Application {
private ApplicationComponent mApplicationComponent;
{...}
private void initializeApplicationComponents() {
mApplicationComponent = DaggerApplicationComponentApi1
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.build();
mApplicationComponent = DaggerApplicationComponentApi2
.builder()
.applicationModule(new ApplicationModule(this, "http://api2"))
.build();
}
{...}
public ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
}
解决每个片段中的匕首依赖关系是这样做的
protected resolveDaggerDependency() {
DaggerFragmentComponent
.builder()
.applicationComponent(getApplicationComponent)
.myModule(new MyModule.class)
.build.inject(this);
}
BaseFragment类具有
public abstract class BaseFragment extends Fragment {
{...}
{...}
{...}
@CallSuper
protected void onViewReady(Bundle savedInstanceState, Intent intent) {
resolveDaggerDependency(); // to be used by child fragments
protected ApplicationComponent getApplicationComponent() {
return ((MyApplication)getActivity().getApplication()).getApplicationComponent;
}
}
在你打电话之前
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1"))
.applicationModule(new ApplicationModule(this, "http://api2"))
.build();
创建项目并使用代码完成来查看Android Studio告诉您的组件生成器可用的内容。我的直觉是,应用程序模块的构造函数不同时接受上下文和字符串。一旦你改变了构造函数,比如说
ApplicationModule(Context context, String url1, String url2) {...}
然后,您需要做的就是更改注入代码以删除.applicationModule的第二行,并更改第一行以匹配新构造函数,即:
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1", "http://api2"))
.build();
mApplicationComponent = DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(this, "http://api1", "http://api2"))
.build();