在我的机器人中使用Dagger 2和MVP模式,并在一些概念上苦苦挣扎。
我们假设我有一位演示者DashboardPresenter
,我在活动或其他演示者中需要时使用以下内容进行注射:
@inject
DashboardPresenter presenter;
或在其他演示者的构造函数中:
@inject
public AccountPresenter(DashboardPresenter presenter) {
//init
}
现在我不太确定它是如何工作的,但我想做以下事情:
我们说我创建了一个BaseDashboardPresenter
,它将是父
我创建了两个孩子:NormalDashboardPresenter
和ProDashboardPresenter
都延伸到它。
当我想在活动或其他演示者中使用它时,我通过调用
注入Base演示者@inject
BaseDashboardPresenter presenter;
我覆盖@inject
行为,根据布尔值注入其中一个子节点。
所以像这样:
//in BaseDashboardPresenter
override inject() {
if(Utility.checkIfUserIsPro()) {
inject ProDashboardPresenter();
} else {
inject NormalDashboardPresenter();
}
}
所以从我的活动中我只是调用Base类中的抽象方法,区别仅在于注入了哪个子项。
这可能吗? 如果需要,很乐意提供更多说明。
答案 0 :(得分:1)
为此,您应该在模块中添加如下内容:
@Provides
public BaseDashboardPresenter provideDashboardPresenter(OtherPresenter presenter) {
if (Utility.checkIfUserIsPro()) {
return new ProDashboardPresenter();
} else {
return new NormalDashboardPresenter(presenter);
}
}
答案 1 :(得分:1)
与其他答案相反,我认为您的模块不应包含任何逻辑。这不是人们所期望的。
另外,如果一个变体需要@Provides
,而另一个变体需要A
,那么您的B
方法将如何显示?现在你需要声明你不需要的依赖项,从现在开始它就会变得更加混乱。
相反,您应该为每个选项创建一个模块,并在组件中包含正确的模块。
// module providing pro version
componentBuilder.addPresenterModule(new ProModule());
// or a default one
componentBuilder.addPresenterModule(new DefaultModule());
无论你在哪里构建组件,都可以决定它应该是什么。更加专注的方法是使用2个完全不同的组件,其中每个组件使用不同的模块等。这对于更复杂的项目可能有意义,但在您的情况下,似乎模块就足够了。