Android 匕首2:基于逻辑注入子类

Android 匕首2:基于逻辑注入子类,android,mvp,dagger-2,Android,Mvp,Dagger 2,在我的android系统中使用Dagger2和MVP模式,并且在一些概念上有些挣扎 假设我有一个presenter仪表板presenter,当我在活动或其他presenter中需要时,我会使用以下方法注入它: @inject DashboardPresenter presenter; 或在其他演示者的构造函数中: @inject public AccountPresenter(DashboardPresenter presenter) { //init } 现在我不太确定它是如何工作

在我的android系统中使用Dagger2和MVP模式,并且在一些概念上有些挣扎

假设我有一个presenter
仪表板presenter
,当我在活动或其他presenter中需要时,我会使用以下方法注入它:

@inject
DashboardPresenter presenter;
或在其他演示者的构造函数中:

@inject
public AccountPresenter(DashboardPresenter presenter) {
    //init
}
现在我不太确定它是如何工作的,但我想做以下几点:

假设我创建了一个
BaseDashboardPresenter
,它将是父级

我为它创建了两个子项:
NormalDashboardPresenter
ProDashboardPresenter
都是从它扩展而来的

当我想在活动或其他演示者中使用它时,我通过调用

@inject
BaseDashboardPresenter presenter;
我重写了
@inject
行为,根据布尔值注入一个子元素。 比如说:

//in BaseDashboardPresenter 
override inject() {
    if(Utility.checkIfUserIsPro()) {
        inject ProDashboardPresenter();
    } else {
        inject NormalDashboardPresenter();
    } 
}
@Provides
public BaseDashboardPresenter provideDashboardPresenter(OtherPresenter presenter) {
    if (Utility.checkIfUserIsPro()) {
        return new ProDashboardPresenter();
    } else {
        return new NormalDashboardPresenter(presenter);
    }
}
因此,在我的活动中,我只调用基类中的抽象方法,区别在于注入了哪个子类

这可能吗?
如果需要,很乐意提供更多的说明。

要做到这一点,您应该在模块中添加如下内容:

//in BaseDashboardPresenter 
override inject() {
    if(Utility.checkIfUserIsPro()) {
        inject ProDashboardPresenter();
    } else {
        inject NormalDashboardPresenter();
    } 
}
@Provides
public BaseDashboardPresenter provideDashboardPresenter(OtherPresenter presenter) {
    if (Utility.checkIfUserIsPro()) {
        return new ProDashboardPresenter();
    } else {
        return new NormalDashboardPresenter(presenter);
    }
}

与另一个答案相反,我认为您的模块不应包含任何逻辑。这不是人们所期望的

另外,如果一个变量需要
A
,而另一个变量依赖于
B
,您的
@提供的
方法会是什么样子?现在,您需要声明不需要的依赖项,从这里开始,它会变得更加混乱


相反,您应该为每个选项创建一个模块,并在组件中包含正确的模块

// module providing pro version
componentBuilder.addPresenterModule(new ProModule());

// or a default one
componentBuilder.addPresenterModule(new DefaultModule());

这样,无论您在哪里构建组件,您都可以决定组件中应该包含什么。更专用的方法是使用两个完全不同的组件,其中每个组件使用不同的模块等。这对于更复杂的项目可能有意义,但在您的情况下,模块似乎就足够了。

@提供的
方法添加逻辑通常不是一个好主意,如果两个变体具有不同的依赖关系,则会变得混乱且难以维护。我的问题中省略了这一点,但NormalDashboardPresenter将其他Presenter和类作为参数,它们都被注入
@inject
公共标准仪表板演示程序(OtherPresenter){}
因此我还需要创建OtherPresenter的实例?@DavidMedenjak是的,您是对的。Dagger应该只管理注入,不应该包含逻辑。Youssef,你可以将extras presenter作为参数传递(我编辑了我的答案)@guillaume谢谢你的示例,我现在就试试谢谢你的答案,但为了确保我理解,你的意思是我创建了两个不同的模块,在活动初始化级别,我检查并添加我想要的模块?如果是这样,那么如果这些模块还具有其他公共依赖关系,我可以将其作为基本模块,还是必须对每个模块重复它们?所以,如果这个问题看起来很愚蠢的话,我只是想从匕首开始world@Youssef一个组件可以有多个模块,因此您可以将公共依赖项移动到第三个模块中