如何在使用 Dagger/MVP 时管理演示者依赖项?
How to manage presenter dependencies while using Dagger/MVP?
我有一个 Presenter,它具有 ApplicationComponent
提供的多个依赖项。现在我使用的一般模式是为演示者使用 @Inject
构造函数。
但我有一个案例,演示者有大约 6 个依赖项。
在这种情况下,构造函数注入仍然是最佳实践吗?我发现构造函数在这种情况下变得非常笨拙。还有其他我想念的方法吗?
如 EpicPandaForce 的评论所述,Presenter 中有很多依赖项可能表明 Presenter 做得太多了。事实上,在 MVP 中,Presenter 很容易退化为 "god object"。尽管如此,多参数构造函数似乎比带有 getter 和 setter 的可变 类 或 属性 注入更可取,后者在评论中隐藏了依赖项的数量。
如果您不能重构您的 Presenter,例如,通过找到它所依赖的更高级别的抽象,具有大量参数的构造函数引起的问题类型将在 [=15= 的第 2 章中解决].
一个选项是将构造函数转换为构建器(有效 Java 项目 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
功能自动生成的生成器。
或者,您可以提取参数对象,但这样做可能会违反 Demeter 法则:
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
}
我有一个 Presenter,它具有 ApplicationComponent
提供的多个依赖项。现在我使用的一般模式是为演示者使用 @Inject
构造函数。
但我有一个案例,演示者有大约 6 个依赖项。 在这种情况下,构造函数注入仍然是最佳实践吗?我发现构造函数在这种情况下变得非常笨拙。还有其他我想念的方法吗?
如 EpicPandaForce 的评论所述,Presenter 中有很多依赖项可能表明 Presenter 做得太多了。事实上,在 MVP 中,Presenter 很容易退化为 "god object"。尽管如此,多参数构造函数似乎比带有 getter 和 setter 的可变 类 或 属性 注入更可取,后者在评论中隐藏了依赖项的数量。
如果您不能重构您的 Presenter,例如,通过找到它所依赖的更高级别的抽象,具有大量参数的构造函数引起的问题类型将在 [=15= 的第 2 章中解决].
一个选项是将构造函数转换为构建器(有效 Java 项目 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
功能自动生成的生成器。
或者,您可以提取参数对象,但这样做可能会违反 Demeter 法则:
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
}