android - 如何在 SDK 中使用 Dagger 2?
问题描述
我有一个主应用程序,它使用 Dagger(一些以前的版本)来提供依赖项。
现在,我正在编写一个我正在使用的 SDK(Dagger 2.10+)。当我有一个应用程序类时,一切都很好,因为应用程序有(HasActivityInjector),它负责 DaggerAppComponent 的初始化。
我的问题是-
- 我应该在我的 sdk 中使用 Dagger 2(我想这样做,因为它使我的代码更易于测试)
- 如果没有,那么我正在考虑编写自己的 Injection 类。
- 如果我这样做,我应该如何在应用程序级别进行初始化,因为我发现的唯一解决方案是在 sdk 中有一个 Application 类并让客户端扩展它。(我不希望在客户端进行这种更改,而不是一个好的设计)。
任何建议都会很棒!
解决方案
我最近不得不解决同样的问题:
创建一个可以在任何受支持的 Android App 中使用的 SDK。
我确实不得不接受这样一个前提,即一些想要使用 SDK 的应用程序本身不会使用 Dagger 甚至依赖注入。
正如 OP 所指出的,创建使用依赖注入的 SDK 的主要问题是应用程序中的应用程序实现。
创建HasActivityInjector、HasFragmentInjector 或 HasSupportFragmentInjector的部分原因是需要遵守以下依赖注入规则:
一个类不应该知道它是如何注入的。参考 A
随着HasXInjector接口的创建,Android 允许将 Dagger Dependency Graph 附加到 Application,然后通过以下代码由 Application 负责注入需要注入的依赖项:
AndroidInjection.inject(this) // <-- 'this' being an Activity or Fragment
SDK ISSUE
问题是 SDK 没有自己的应用程序实现。此外,SDK 不能向 App 的 Application 实现添加任何内容,也不能覆盖 App 的 Application 实现。在外部 SDK 的情况下,它甚至不知道应用程序的实现,只知道应用程序接口。
所以即使已经包含了SDK的Application使用了Dagger,这是无法保证的,SDK也无法将自己的Dependency Graph添加到App的Application实现所使用的Dependency Graph中,使得所有的SDK依赖都无法访问。
如果应用程序不使用 Dagger,首先如何注入依赖项?
我自己对此问题的解决方案是打破上面引用的规则,并且不在 SDK 内部使用HasActivityInjector、HasFragmentInjector 或 HasSupportFragmentInjector进行注入。
推荐阅读
- python-3.x - 希望使用 .dat 文件制作二维地图的初学者
- python - Python - 将纬度/经度转换为几何
- java - Android Studio 上的 Android 模拟器中未显示按钮
- postgresql - postgresql 日志转储到表中
- javascript - 添加项目以回复 KnexJs
- sql-server - 在 CTE 中寻求 Tsql 错误连接解释
- javascript - Reactjs - SetTimeout 与状态更改重新渲染
- r - 检查同一组中各行的值的最快方法是什么?
- php - PHP多行正则表达式的最大字符长度?
- javascript - Javascript Unittest Jest 一天的时间间隔