我在 Android studio 中以类似于以下的方式组织了一个项目:
:lib_commons
:module_auth
:app_demo
lib_commons
和 module_auth
基本上是 Android 库项目。
module_auth
是一个独立的、可插入的模块,可以附加到项目中的几个应用程序。它包含一个 Activity 和几个带有可注入(inject)字段的 fragment 。由于 Android 将负责管理这些 Activity 和 fragment ,因此我必须手动注入(inject)字段,例如 Activity 中的 daggerComponent.inject(this)
应用组件,以及当前驻留在项目中各个应用中的其他相关模块(例如app_demo),都将由相应应用中的Application子类实例化。
这意味着我无法从 module_auth
访问应用程序组件,因此无法进行注入(inject)。
我曾尝试将 Dagger 组件移至 commons,但这需要它了解所有可能的注入(inject)点,这是不可能的,因为 commons 通常不知道任何这些应用程序的存在。
问题
组织项目以便我可以从此模块访问应用程序组件的可能的干净方法是什么?请记住,该组件实际上会在 app_demo
的 Application 对象中实例化
在 dagger 1 中,我可以轻松地将对象图放在 commons 中,并从项目中的任何已注册类调用 graph.inject(this)
。我只需要为每个应用程序分别加载相应的 Dagger 模块。
我可以在 commons 中创建一个抽象应用程序,其中包含一个抽象的 getModules
方法,然后该方法将在应用程序中实现。然而,对象图仍然是同一个,注入(inject)非常简单。
我如何在 Dagger 2 中实现这一点?
请指教。谢谢。
最佳答案
好的,所以我找到了一种方法来处理这个问题,从这篇博文 https://www.future-processing.pl/blog/dependency-injection-with-dagger-2/ 中获得了一些见解。
这是我的方法:
我有一个组件接口(interface),例如 :lib_commons
中的 AppComponent
,它实际上是空的。这将作为具体应用程序的 super 组件 :app_*
我在 :lib_commons
中有一个抽象的 BaseApplication
,类似于
public abstract class BaseApplication<T extends AppComponent> extends Application {
private T mComponent;
@Override
public void onCreate() {
super.onCreate();
mComponent = createComponent();
}
protected abstract T createComponent();
public T getComponent() {
return this.mComponent;
}
}
基本 Activity 、 fragment 等看起来与此类似:
public class BaseActivity extends Activity {
/**
* Get the Main Application component for dependency injection.
*/
protected <C> C getAppComponent(Class<C> componentType) {
return componentType.cast(((BaseApplication) getApplication()).getComponent());
}
}
所以,在实际组件还不存在的':module_*
中,我将创建常规接口(interface)来声明注入(inject)方法,这样注入(inject)就像
getAppComponent(InjectionInterface.class).inject(this);
最后,:app_*
模块将包含实际的组件接口(interface),该接口(interface)将扩展 super AppComponent
和在中声明的所有其他相应的 InjectionInterface
它所依赖的模块。然后,我将创建一个扩展 BaseApplication
的具体 Application 类,并简单地实现抽象的 createComponent
方法,从而完成注入(inject)循环。
希望这对某人有帮助。
关于android - 在 Android 中设置 Dagger 2 和项目组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849421/