我在Android studio中以类似于下面的方式组织了一个项目:
:lib_commons
:module_auth
:app_demo
lib_commons
和module_auth
基本上是Android库项目。
module_auth
是一个独立的,可插入的模块,可以附加到项目中的几个应用程序中。它包含一个活动和几个带有可注射字段的片段。由于Android将负责管理这些活动和片段,我必须手动注入字段,例如活动中的daggerComponent.inject(this)
应用程序组件以及当前驻留在项目中各种应用程序中的其他相关模块(例如app_demo),都将由相应应用程序中的Application子类实例化。
这意味着我无法访问module_auth
中的应用程序组件,因此无法进行注入。
我已经尝试将匕首组件移动到公共区域,但这需要它知道所有可能的注入点,这是不可能的,因为公共通常不知道是否存在任何这些应用程序。
组织项目的可能的干净方法是什么,以便我可以从该模块访问应用程序组件?请记住,组件实际上将在app_demo
的Application对象中实例化
在匕首1中,我可以轻松地将对象图放在公共区域中,并从项目中任何已注册的类中调用graph.inject(this)
。我只需要为每个应用分别加载相应的匕首模块。
我可以在包含抽象getModules
方法的公共文件中创建一个抽象的应用程序,然后在应用程序中实现。然而,对象图仍然是相同的,注入非常简单。
我如何在匕首2中实现这一点?
请告知。感谢。
答案 0 :(得分:2)
好的,所以我找到了解决这个问题的方法,并从这篇博文https://www.future-processing.pl/blog/dependency-injection-with-dagger-2/
中获得了一点见解这是我的方法:
我有一个组件界面,在AppComponent
中说:lib_commons
几乎是空的。这将作为具体应用:app_*
我在BaseApplication
中有一个抽象的:lib_commons
,类似于
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;
}
}
基本活动,片段等与此类似:
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_*
中,我将创建定义接口来声明注入方法,因此注入就像
getAppComponent(InjectionInterface.class).inject(this);
最后,:app_*
模块将包含实际的组件接口,该接口将扩展超级AppComponent
以及它所依赖的模块中声明的每个其他对应的InjectionInterface
。然后,我将创建一个扩展BaseApplication
的具体Application类,并简单地实现抽象createComponent
方法,完成注入循环。
希望这有助于某人。