Как включить зависимость от @ModuleA, в @ModuleB, используя Dagger2 в Java - PullRequest
0 голосов
/ 29 ноября 2018

Я использую Dagger2 для внедрения зависимостей в довольно большой проект.Есть 2 различных раздела приложения, каждый из которых использует несколько вариантов использования.Для каждого раздела у меня есть модуль, который обеспечивает зависимости для этого раздела.Я столкнулся со сценарием, в котором мне нужно использовать сценарий использования из moduleA в ModuleB, и я не уверен, как включить его или добавить его для использования в этом сценарии. Я смотрел другие ответы на stackoverflow, но не нашел ни одногоэто отвечает на мой вопрос.

Например, этот ответ здесь

не помогает мне, потому что его настройка отличается, и я не могу вывести из этого решения, как решить мою проблему.

и здесь

Я не уверен, что мне следует превратить какую-либо из этих зависимостей в синглтоны.

например, у меня есть ModuleA ниже, который содержит AddItem , который мне нужен в ModuleB PayForItem

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

Как бы я использовал AddItem из ModuleA в PayForItem ModuleB без повторения этих зависимостей в ModuleB?

...