android - 如何在 SDK 中使用 Dagger 2?

标签 android sdk dagger-2

我有一个主应用程序,它使用 Dagger(某些以前的版本)来提供依赖项。

现在,我正在编写一个正在使用的 SDK(Dagger 2.10+)。当我有一个应用程序类时,一切工作正常,因为应用程序有(HasActivityInjector)并且它负责 DaggerAppComponent 的初始化。

我的问题是 -

  • 我应该在我的 SDK 中使用 Dagger 2(我想这样做,因为它使我的代码更易于测试)
  • 如果没有,那么我正在考虑编写自己的注入(inject)类。
  • 如果我选择它,我应该如何在应用程序级别初始化,因为我发现的唯一解决方案是在 sdk 中拥有一个 Application 类并让客户端扩展它。 (我不希望在客户端进行此更改,这不是一个好的设计)。

任何建议都会很棒!!

最佳答案

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

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

正如 OP 所指出的,创建使用依赖注入(inject)的 SDK 的主要问题是应用程序中的应用程序实现。

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

A class shouldn’t know anything about how it is injected. Reference A


随着 HasXInjector 接口(interface)的创建,Android 允许将 Dagger 依赖关系图附加到应用程序,然后应用程序负责将依赖项注入(inject)到它们所在的位置。需要通过以下代码注入(inject):

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


SDK问题
问题是 SDK 没有自己的应用程序实现。另外,SDK不能向App的Application实现添加任何东西,也不能覆盖App的Application实现。 对于外部 SDK,它甚至不知道应用程序实现,只知道应用程序接口(interface)。

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

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

关于android - 如何在 SDK 中使用 Dagger 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52441155/

相关文章:

android - Ascii 复选标记在移动设备中始终为红色

iphone - 使用 "self.variable = value"设置实例变量两次会导致内存泄漏吗?

android - 无法启动 Activity ComponentInfo{...} : java. lang.NullPointerException

java - ViewModel 没有零参数构造函数错误,原因是 ViewModelFactory 一直为 null(不是 100% 确定)

java - "provides"方法或注入(inject)类上的 Dagger 2 范围注释

android - 使用 Flutter 将图像上传到通用 Google Drive 帐户

android - 如何通过命令行查找设备的 Android 操作系统版本?

Android - 使用 OpenCV4Android 旋转图像

ios - 使用 Facebook iOS SDK 3.1.1 将照片上传到 Facebook 时出错

android - Dagger 2 : Inject child class based on logic