如何在SDK中使用Dagger 2?

时间:2018-09-21 09:56:25

标签: android sdk dagger-2

我有一个主要应用程序,该应用程序使用Dagger(某些早期版本)来提供依赖项。

现在,我正在编写要使用的SDK(Dagger 2.10+)。当我有一个应用程序类时,一切正常,就像应用程序具有(HasActivityInjector)一样,它负责DaggerAppComponent的初始化。

我的问题是-

  • 我应该在SDK中使用Dagger 2吗?(我想这样做是因为它使我的代码更具可测试性)
  • 如果没有,那么我正在考虑编写自己的Injection类。
  • 如果要这样做,我应该如何在应用程序级别进行初始化,因为我发现的唯一解决方案是在sdk中具有Application类,并使客户端对其进行扩展。 (我不想在客户端进行此更改,而不是一个好的设计)。

任何建议都会很棒!

1 个答案:

答案 0 :(得分:1)

我最近不得不解决同一问题:
创建可在任何受支持的Android应用中使用的SDK

我确实必须接受这样一个前提,即某些想要使用SDK的应用程序本身不会使用Dagger甚至依赖项注入。

正如OP指出的那样,创建使用依赖项注入的SDK的主要问题是App中的 Application 实现。

创建 HasActivityInjector,HasFragmentInjector或HasSupportFragmentInjector 的部分原因是需要遵守以下依赖项注入规则:

  

一个班级应该对注入方式一无所知。 Reference A


通过创建 HasXInjector 接口,Android允许将Dagger依赖关系图附加到应用程序,然后由应用程序负责将依赖关系注入到它们需要通过以下代码注入:

AndroidInjection.inject(this) // <-- 'this' being an Activity or Fragment


SDK问题
问题是SDK没有自己的Application实现。此外,SDK不能向App的Application实现添加任何内容,也不能覆盖App的Application实现。 在使用外部SDK的情况下,它甚至不知道应用程序的实现,只知道应用程序接口。

因此,即使未保证包含SDK的应用程序使用Dagger,SDK也无法将其依赖关系图添加到App的Application实现所使用的依赖关系图中,从而使所有SDK依赖关系均不可访问。 /> 如果应用程序不使用Dagger,那么首先如何注入依赖项?

我自己针对此问题的解决方案是打破上面引用的规则,而不在SDK内部使用 HasActivityInjector,HasFragmentInjector或HasSupportFragmentInjector 进行注入。