Dagger 2:根据逻辑

时间:2017-09-12 11:55:22

标签: android mvp dagger-2

在我的机器人中使用Dagger 2和MVP模式,并在一些概念上苦苦挣扎。

我们假设我有一位演示者DashboardPresenter,我在活动或其他演示者中需要时使用以下内容进行注射:

@inject
DashboardPresenter presenter;

或在其他演示者的构造函数中:

@inject
public AccountPresenter(DashboardPresenter presenter) {
    //init
}

现在我不太确定它是如何工作的,但我想做以下事情:

我们说我创建了一个BaseDashboardPresenter,它将是父

我创建了两个孩子:NormalDashboardPresenterProDashboardPresenter都延伸到它。

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

注入Base演示者
@inject
BaseDashboardPresenter presenter;

我覆盖@inject行为,根据布尔值注入其中一个子节点。 所以像这样:

//in BaseDashboardPresenter 
override inject() {
    if(Utility.checkIfUserIsPro()) {
        inject ProDashboardPresenter();
    } else {
        inject NormalDashboardPresenter();
    } 
}

所以从我的活动中我只是调用Base类中的抽象方法,区别仅在于注入了哪个子项。

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

2 个答案:

答案 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个完全不同的组件,其中每个组件使用不同的模块等。这对于更复杂的项目可能有意义,但在您的情况下,似乎模块就足够了。