我正在尝试将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”始终为空。但是,如果我不使用provide方法,而仅使用字段注入并处理“模块”中的所有依赖项,则它可以工作。因此,从我的角度来看,存在三种可能性:1)仅执行字段注入并处理模块类中的所有依赖项。2)仅进行构造函数注入,并将所有依赖项作为构造函数参数。3)混合两者,但在构造函数中的ObjectGraph对象上调用.inject(this)以满足带有@Inject批注的字段。
这样对吗?
编辑:我不能使用完整的构造函数注入,因为在另一个模块中声明了'baz'。编辑示例。
@Module(includes = Module.class)
public class BasicModule {
@Provides
public baz provideBaz() {
return new baz();
}
}
我认为您正在尝试做的事情是可能的。我认为您想将活动图添加到匕首中的主应用程序图中。
查看https://github.com/square/dagger/tree/master/examples/android-activity-graphs。
还有您的类吧,您可能应该完成构造函数注入。但是,如果您必须按照自己的方式进行操作,则需要在模块中调用注入和注册栏。这是我创建酒吧的方式。
public class Bar {
private final Activity activity;
private final Baz baz;
@Inject public bar(FooActivity activity, Baz baz) {
this.activity = activity;
this.baz = baz;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句