android - 在 Android 中设置 Dagger 2 和项目组织

标签 android dependency-injection dagger dagger-2

我在 Android studio 中以类似于以下的方式组织了一个项目:

  • :lib_commons
  • :module_auth
  • :app_demo

lib_commonsmodule_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/

相关文章:

android - "ionic build android "给出 ANDROID_HOME 错误

android - 不同的编码问题

java - 远程服务的 EJB 依赖注入(inject)在 Glassfish 上失败

Android Dagger 依赖循环

android - Dagger 和 Android 上下文限定符

java.lang.OutOfMemory错误: GC overhead limit exceeded android studio

java - RecyclerView 搜索过滤器不起作用

dependency-injection - 如何在使用注入(inject)的构造函数上忽略 "too many parameters"

dependency-injection - 如何使用 Ninject 在子类中创建实例?

Android Dagger 依赖注入(inject)在私有(private)字段上失败