Я использую 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?