是否可以在Dagger中混合构造函数和场注入?

时间:2014-06-03 13:43:49

标签: android dependency-injection dagger

我正在尝试将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();
    }
}

1 个答案:

答案 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;
    }
}