我正在尝试将Dagger用于我的android项目,但我遇到了一个问题:是否可以混合构造函数和字段注入? 我有一个模块和两个类:
@Module(injects = fooActivity.class)
public class Module {
private fooActivity activity;
public Module(fooActivity activity) {
this.activity = activity;
}
@Provides
public bar provideBar() {
return new bar(activity);
}
}
public class fooActivity extends Activity {
@Inject Baz baz;
public void onCreate(Bundle savedInstanceState) {
...
ObjectGraph graph = ObjectGraph.create(new BasicModule()).plus(new Module(this));
graph.inject(this);
}
}
public class bar {
@Inject Baz baz;
@Inject FooActivity activity;
public bar(FooActivity activity) {
this.activity = activity;
}
}
问题在于“Bar”类中的'baz'在注入后始终为null。但它可以工作,如果我不使用提供方法但只使用字段注入并处理'模块'中的所有依赖项。 所以从我的角度来看,有三种可能性: 1)仅进行字段注入并处理模块类中的所有依赖项。 2)仅进行构造函数注入并将所有依赖项作为构造函数参数。 3)混合两者但在构造函数中的ObjectGraph对象上调用.inject(this)以满足带@Inject批注的字段。
这是对的吗?
编辑: 我不能使用完整的构造函数注入,因为'baz'在另一个模块中声明。编辑示例。
@Module(includes = Module.class)
public class BasicModule {
@Provides
public baz provideBaz() {
return new baz();
}
}
答案 0 :(得分:1)
我认为你想做的事情是可能的。我想你想用匕首将你的活动图添加到主应用程序图中。
查看https://github.com/square/dagger/tree/master/examples/android-activity-graphs。
同样是你的类吧,你应该做完整的构造函数注入。但是如果必须按照自己的方式进行,则需要在模块中调用注入和注册条。这是我创建Bar的方式。
public class Bar {
private final Activity activity;
private final Baz baz;
@Inject public bar(FooActivity activity, Baz baz) {
this.activity = activity;
this.baz = baz;
}
}