我正在使用
Dagger将依赖项注入到
Android应用程序,我偶然发现了一个我不完全确定的问题
如何以干净的方式解决.
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并因此注入它.