在Android

时间:2015-09-29 16:40:47

标签: android dependency-injection dagger dagger-2

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

  • :lib_commons
  • :module_auth
  • :app_demo

lib_commonsmodule_auth基本上是Android库项目。 module_auth是一个独立的,可插入的模块,可以附加到项目中的几个应用程序中。它包含一个活动和几个带有可注射字段的片段。由于Android将负责管理这些活动和片段,我必须手动注入字段,例如活动中的daggerComponent.inject(this)

应用程序组件以及当前驻留在项目中各种应用程序中的其他相关模块(例如app_demo),都将由相应应用程序中的Application子类实例化。 这意味着我无法访问module_auth中的应用程序组件,因此无法进行注入。 我已经尝试将匕首组件移动到公共区域,但这需要它知道所有可能的注入点,这是不可能的,因为公共通常不知道是否存在任何这些应用程序。

问题

组织项目的可能的干净方法是什么,以便我可以从该模块访问应用程序组件?请记住,组件实际上将在app_demo的Application对象中实例化

在匕首1中,我可以轻松地将对象图放在公共区域中,并从项目中任何已注册的类中调用graph.inject(this)。我只需要为每个应用分别加载相应的匕首模块。 我可以在包含抽象getModules方法的公共文件中创建一个抽象的应用程序,然后在应用程序中实现。然而,对象图仍然是相同的,注入非常简单。

我如何在匕首2中实现这一点?

请告知。感谢。

1 个答案:

答案 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方法,完成注入循环。

希望这有助于某人。