如何在使用Dagger / MVP时管理演示者依赖关系?

时间:2017-06-05 16:51:49

标签: android dagger-2 android-mvp

我有一个Presenter,它有多个依赖项,由*提供。现在我使用的一般模式是为演示者使用ApplicationComponent构造函数。

但我有一个案例,主持人有大约6个依赖项。 在这种情况下,构造函数注入仍然是最佳实践吗?在这种情况下,我发现构造函数变得非常笨拙。还有另一种方法,我错过了吗?

1 个答案:

答案 0 :(得分:1)

正如EpicPandaForce的评论在Presenter中有很多依赖关系可能表明演示者做得太多了。实际上,在MVP中,演示者很容易退化成一个神对象"。尽管如此,似乎多参数构造函数优于具有getter和setter的可变类或者属性注入,如注释中那样,它隐藏了依赖项的数量。

如果您不能重构您的演示者,例如,通过找到更高级别的抽象来依赖它,那么具有大量参数的构造函数引起的问题类型将在Effective Java by Joshua Bloch的第2章中讨论。

一种选择是将构造函数转换为构建器(Effective Java Item 2)。所以而不是:

public Foo(Bar bar, Baz baz, Zap zap) {
    this.bar = bar;
    this.baz = baz;
    this.zap = zap;
}

你有:

public class FooBuilder {
    private Bar bar;
    private Baz baz;
    private Zap zap;

    public FooBuilder setBar(Bar bar) {
        this.bar = bar;
        return this;
    }

    public FooBuilder setBaz(Baz baz) {
        this.baz = baz;
        return this;
    }

    public FooBuilder setZap(Zap zap) {
        this.zap = zap;
        return this;
    }

    public Foo createFoo() {
        return new Foo(bar, baz, zap);
    }
}

这只是您使用Android Studio Refactor/Replace constructor with builder功能获得的自动生成的构建器。

或者,你可以提取一个参数对象,但是这样做可能违反了得墨忒耳法则:

class FooParams {
    final Bar bar;
    final Baz baz;
    final Zap zap;

    FooParams(Bar bar, Baz baz, Zap zap) {
        this.bar = bar;
        //etc
    }
}

public Foo(FooParams fooParams) {
    this.fooParams = fooParams;
    fooParams.baz.doBazThings(); //etc
}