如何在Java中使用Dagger2在@ModuleB中包括来自@ModuleA的依赖项

时间:2018-11-29 07:22:20

标签: java android dagger-2

我在相当大的项目中使用Dagger2进行依赖项注入。 应用程序有2个不同的部分,每个部分都使用多个用例。 对于每个部分,我都有一个模块来提供该部分的依赖关系。我遇到了一种情况,我需要在ModuleB中使用来自moduleA的用例,但不确定如何将其添加或添加到该用例中。我在stackoverflow上查看了其他答案,但没有找到一个回答了我的问题。

例如,此答案here

对我没有帮助,因为它的设置不同,而且我无法从该解决方案中推断出如何解决我的问题。

here

我不确定是否应该将所有这些依赖项都放入Singletons中。

例如,我下面的ModuleA包含我在ModuleB PayForItem

中需要的 AddItem
@Module
public class ModuleA {

    private final FragmentActivity mActivity;

    public ModuleA(FragmentActivity fragmentActivity) {
        mActivity = fragmentActivity;
    }
...

  @Provides
  AddItem addItemPresenter(DateMapper dataMapper, ItemdetailUseCase itemDetailUsecase){
        return new AddItem(dataMapper,itemDetailUsecase);
    }



@Module
    public class ModuleB {

        private final FragmentActivity mActivity;

        public ModuleB(FragmentActivity fragmentActivity) {
            mActivity = fragmentActivity;
        }
    ...

      @Provides
      PayForItem payForItemPresenter(AddItem addItem){
            return new AddItem(addItem);
        }

每个模块都包含在其自己的子组件中,例如:

@Subcomponent(modules = {ModuleA.class})
public interface ModuleAPresentationComponent {
    void inject(Fragment testFragment;
}


@Subcomponent(modules = {ModuleB.class})
public interface ModuleBPresentationComponent {
    void inject(Fragment testFragment;
}

两者都包含在主要组件中,例如:

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    public ModuleAPresentationComponent newPresentationComponent(ModuleAPresentationModule presentationModule);
    public ModuleBPresentationComponent newPresentationComponent(ModuleBPresentationModule presentationModule);
}

我有一个BaseFragment可用于注入例如:

public abstract class BaseFragment extends Fragment {

    private boolean mIsInjectorUsed;
    protected static final String PARAM_USER_ID = "param_user_id";

    private ApplicationComponent getApplicationComponent() {
        return ((AndroidApplication) getActivity().getApplication()).getApplicationComponent();
    }

    @UiThread
    protected ModuleAPresentationComponent getModuleAPresentationComponent() {
        if (mIsInjectorUsed) {
            throw new RuntimeException("there is no need to use injector more than once");
        }
        mIsInjectorUsed = true;
        return getApplicationComponent()
                .newPresentationComponent(new ModuleAPresentationModule(getActivity()));
    }

    @UiThread
    protected ModuleBPresentationComponent getModuleBPresentationComponent() {
        if (mIsInjectorUsed) {
            throw new RuntimeException("there is no need to use injector more than once");
        }
        mIsInjectorUsed = true;
        return getApplicationComponent()
                .newPresentationComponent(new ModuleBPresentationModule(getActivity()));
    }

所以在我的片段中,它是这样注入的:

public class testFragment extends BaseFragment{

 @Inject AddItem addItemPresenter;

       @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            getModuleAPresentationComponent().inject(this);
        }
}

我如何在 PayForItem ModuleB中使用ModuleA中的 AddItem ,而不在ModuleB中重复这些依赖项?

0 个答案:

没有答案