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