【问题标题】:Is it possible to mix constructor and field injection in Dagger?是否可以在 Dagger 中混合构造函数和字段注入?
【发布时间】:2014-06-03 13:43:49
【问题描述】:

我正在尝试将 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”始终为空。但是,如果我不使用提供方法而只使用字段注入并处理“模块”中的所有依赖项,它就可以工作。 所以在我看来,有三种可能: 1) 仅进行字段注入并处理模块类中的所有依赖项。 2) 只进行构造函数注入,并将所有依赖项作为构造函数参数。 3) 混合两者,但在构造函数中对 ObjectGraph 对象调用 .inject(this) 以满足带有 @Inject 注释的字段。

这是正确的吗?

编辑: 我不能使用完整的构造函数注入,因为在另一个模块中声明了“baz”。编辑示例。

@Module(includes = Module.class)
public class BasicModule {
    @Provides 
    public baz provideBaz() {
        return new baz();
    }
}

【问题讨论】:

    标签: android dependency-injection dagger


    【解决方案1】:

    我认为您尝试做的事情是可能的。我认为您想将活动图添加到 dagger 中的主应用程序图中。

    查看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;
        }
    }
    

    【讨论】:

    • 我有两个不同的模块,所以我不能使用完整的构造函数注入。因此,在我的情况下,我必须将 Bar 定义为 Module 中的注入点,像在 Foo 的 onCreate() 中一样创建一个新的 ObjectGraph 并调用 graph.inject(this) ?
    • 我的应用程序中有很多模块,我使用构造函数注入。你应该只在活动、片段和视图上真正使用字段注入,因为你被困在那里使用默认构造函数。你能解释一下为什么你认为你不能使用构造函数或告诉我你得到的错误吗?就像我之前说的,我认为您需要将活动模块添加到应用程序模块中。
    • 将活动模块添加到应用程序模块是指'ObjectGraph.create(new BasicModule()).plus(new Module(this));'
    • 是的,除非您想获取应用程序图而不是在活动中创建它。请查看我在答案中发布的 github 链接。
    • 我的例子被缩短了。 BasicModule 实际上是在扩展 Application 的类中创建的应用程序图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2018-06-08
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多