Java Dagger2使用不同的URL构建了多个改型实例,用于使用构造函数注入攻击不同的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

我一直坚持使用mvp完成Dagger2改造2的实现,我的应用程序在各自的片段中调用两个不同的API。 我已经定义了限定符注释来为每个Api调用绑定一个改型实例,如下所示

@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();