2017-06-05 59 views
0

我有一个Presenter,它具有ApplicationComponent提供的多个依赖关系。现在我使用的一般模式是为演示者使用@Inject构造函数。如何在使用Dagger/MVP时管理演示者依赖项?

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

+2

,你有6所依赖的事实表明你的演讲做了太多的事情。野外注射只是隐藏你的眼前。 – EpicPandaForce

+0

你说得对。我现在看到了。 – Anoop

回答

1

如在EpicPandaForce的评论中,在演示者中有很多依赖关系可能是演示者做得太多的标志。事实上,在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 
}