我在相当大的项目中使用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中重复这些依赖项?