【发布时间】:2019-11-20 22:54:01
【问题描述】:
我有一个类,我想通过 Dagger 注入。它需要一个构建器,因为它的一些参数仅在运行时才知道。我也希望这个类是单身人士。
也就是说,我们的代码库有几部分需要这个类的实例,但实际上只有一部分代码知道如何设置它。
设置发生在应用程序的早期 - 在任何人实际尝试使用单例之前 - 但在 Dagger 已经初始化其根组件之后。
代码的其他部分访问对象的正确方法是什么?
class S {
private S(Foobar foobar) {
// ...
}
@Singleton
public static class Builder {
Foobar foobar;
@Inject
public Builder() {}
public Builder setFoobar(Foobar foobar) {
this.foobar = foobar;
}
public S build() {
return new S(foobar);
}
}
}
class Main {
private Foobar foobar = new Foobar();
private final S s;
@Inject
public Main(S.Builder sBuilder) {
s = sBuilder.setFoobar(foobar).build();
}
}
class Other {
private final S s;
@Inject
public Other(/* What do I put here to get access to S? */) {
}
编辑:
为清楚起见,让我声明此示例中的 Foobar 是在应用程序的早期创建的,但在 Dagger 和应用程序的高级结构已被实例化之后。这个特定的程序是一个 Android 应用程序;在这种情况下,Foobar 是一个膨胀的视图,S 是该视图的控制器。
只有一个Foobar 和一个S。我们代码的各个部分都希望能够与S 通信,但实际上只有一部分代码可以创建它。
【问题讨论】:
-
这是一个奇怪的设计。使用构建器到组合根中的实例,然后将实例/单例传递给容器以供使用。
-
@Nkosi 我不确定我是否遵循。直到设置注入后的某个时间,我才能创建 S。 S 需要一个在应用程序启动后期发生的对象。
标签: java dependency-injection dagger-2