gpt4 book ai didi

android - Dagger 和嵌套注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:34 25 4
gpt4 key购买 nike

我正在使用 Dagger将依赖项注入(inject)Android 应用程序,我偶然发现了一个我不太确定的问题如何以干净的方式解决。

我想要实现的是实例化助手并将它们注入(inject)我的 Activity ,并让这些助手也包含注入(inject)的成员。

什么有效

正在注入(inject)我的助手的 Activity :

public class MyActivity extends Activity {
@Inject SampleHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

((MyApplication) getApplication()).inject(this);

Log.i("debug", "helper = " + helper);
Log.i("debug", "helper context = " + helper.context);
}
}

创建对象图的应用程序:

public class MyApplication extends Application {
private ObjectGraph graph;

@Override
public void onCreate() {
super.onCreate();

graph = ObjectGraph.create(getModules());
}

private Object[] getModules() {
return new Object[] { new MyModule(this) };
}

public void inject(Object target) {
graph.inject(target);
}
}

当我直接实例化一个 SampleHelper 类时,注入(inject)工作完美,它反过来接收注入(inject)的应用程序上下文:

@Singleton
public class SampleHelper {

@Inject public Context context;

@Inject
public SampleHelper() {}
}

使用以下模块:

@Module(
injects = { MyActivity.class },
complete = false,
library = true
)
public class MyModule {
private final MyApplication application;

public MyModule(MyApplication application) {
this.application = application;
}

@Provides @Singleton Context provideApplicationContext() {
return application;
}
}

什么不起作用

但是,当我将辅助接口(interface)与其实现分开时:

public interface SampleHelper {
}

@Singleton
public class SampleHelperImpl implements SampleHelper {

@Inject public Context context;

@Inject
public SampleHelperImpl() {}
}

并将其添加到 Dagger 模块中:

public class MyModule {
...

// added this method
@Provides @Singleton public SampleHelper provideSampleHelper() {
return new SampleHelperImpl();
}

...
}

上下文没有像我预期的那样注入(inject)到我的 SampleHelperImpl 中。现在,我猜这是由于 SampleHelperImpl 是通过直接构造函数调用而不是那个注入(inject)启动的构造函数调用,因为 MyModule#provideApplicationContext() 甚至没有被调用,所以我猜我遗漏了一些关于 Dagger 的东西(这很可能,因为我以前的 DI 经验只包括 Spring)。

关于如何以“干净的 Dagger”方式将我的上下文注入(inject)到注入(inject)的帮助程序实现中有什么想法吗?

非常感谢!

最佳答案

这是一个相当古老的问题,但我认为您想要的是:

@Provides @Singleton public SampleHelper provideSampleHelper(SampleHelperImpl impl) {
return impl;
}

这样 Dagger 将创建您的 SampleHelperImpl 并因此注入(inject)它。

关于android - Dagger 和嵌套注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com