android – 匕首和嵌套注射

前端之家收集整理的这篇文章主要介绍了android – 匕首和嵌套注射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 Dagger将依赖项注入到
Android应用程序,我偶然发现了一个我不完全确定的问题
如何以干净的方式解决.

我想要实现的是实现帮助并将其注入我的内部
活动,并让这些助手也包含注入的成员.

什么有效

我的助手注入的活动:

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类时,注入工作完美,
它反过来接收注入的应用程序上下文:

@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;
    }
}

什么行不通

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

public interface SampleHelper {
}

@Singleton
public class SampleHelperImpl implements SampleHelper {

    @Inject public Context context;

    @Inject
    public SampleHelperImpl() {}
}

并将其添加到匕首模块:

public class MyModule {
    ...

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

    ...
}

正如我所料,上下文不会被注入我的SampleHelperImpl中.现在,我想这是由于SampleHelperImpl是通过直接构造函数调用而实现的
那个注入启动的构造函数调用,因为MyModule#provideApplicationContext()甚至没有被调用,所以我的猜测是我错过了一些关于Dagger的东西(很可能,因为我以前的DI体验只包括Spring).

关于如何在我的注入帮助器实现中以“干净的Dagger”方式注入我的上下文的任何想法?

非常感谢!

解决方法

这是一个相当古老的问题,但我认为你想要的是:
@Provides @Singleton public SampleHelper provideSampleHelper(SampleHelperImpl impl) {
    return impl;
}

这样Dagger将创建SampleHelperImpl并因此注入它.

原文链接:https://www.f2er.com/android/310854.html

猜你在找的Android相关文章