如何在不影响代码的情况下将我的 DI 框架从匕首更改为其他框架?



>Dagger看起来像一个不错的Android框架。但是它是如何将自己与实际项目脱钩的呢?

如果我在我的一个项目中使用它并且我不想再使用它,如何在不影响我的代码的情况下从我的项目中删除它?

> Dagger 符合 JSR-330 注入标准,这是依赖注入表面的 Java 规范。这意味着您用于应用程序的大多数配置(至少分布在应用程序中的文件中)都是按照 Java 依赖关系注入标准而不是 Dagger 本身编码的。

除非使用Lazy<T>注入,否则您可能只能在最顶层切换依赖项注入框架,在该级别定义@Component并引用@Module类。您还可以通过组件依赖关系和模块的巧妙使用将 Dagger 组件与非 Dagger DI 互连,或者编写自己的组件和子组件实现,无论它们上是否有 Dagger 注释。Dagger 还将其注释和公共接口打包在与注释处理器不同的包中,因此您可以摆脱 Dagger 代码生成,而无需在同一天清理注释。

您会在常见文件中找到的内容:

  • @InjectProvider<T>@Qualifier@Scope:JSR-330标准。这些是您应该在使 DI 感知的文件中看到的接口,以及您在应用程序中使用的自定义限定符和作用域。JSR-330 中还定义了通用范围@Singleton和通用限定符@Named
  • @AutoFactory:Dagger推荐的解决方案,用于自动生成工厂接口和实现,但不是Dagger的一部分。使用@InjectProvider<T>,设计用于 Spring、Guice 和其他 DI 环境。相比之下,Guice的解决方案是使用FactoryModuleBuilder,这是反射的和Guice特定的。
  • Lazy<T>:提供程序的dagger特定接口,只计算一次其值。您可以为任何 T Dagger 理解注入Lazy<T>Provider<T>,但与提供程序接口本身不同,Lazy 未在 JSR-330 中定义。dagger使用自己的。
  • MembersInjector<T>:dagger专用,但不经常明确使用。

正确的dagger配置,与您的业务逻辑分开:

  • @Module@Provides@Binds:特定于dagger,因为每个依赖注入结构都使用自己的配置类型。Guice反射性地使用Java模块,Spring以其XML配置而闻名。请记住,可以从任何代码(包括手写代码)调用编写良好的@Provides方法。
  • @CanReleaseReferences和可发布引用管理器:特定于dagger的扩展。
  • @ContributesAndroidInjector、AndroidInjector 和 DispatchingAndroidInjector:特定于dagger的扩展。
  • @Component@Subcomponent:特定于 Dagger 的注释,但由于这些注释被定义为接口,因此您可以随意实现它们,包括手动。您还可以创建一个没有任何dagger或 DI 注释的接口,并让dagger注释的接口扩展非dagger注释的注释。

最后,Dagger 可以做的一件偷偷摸摸的事情:Dagger 将相邻包中的实现写入你的@Inject类和模块。因此,您可以(例如)通过 Dagger 创建对象,如果不编写调用对象的包私有@Inject构造函数的public工厂,就无法创建这些对象。如果你想去掉 Dagger 并手写你的等效构造函数,你可能会发现自己向许多@Inject注释的方法和字段中添加了public,或者在这些包中编写了许多帮助程序类,它们可以在这些包中访问封装的方法和字段本身。

简而言之,尽管您可能在顶层和某些软件包中具有特定于 Dagger 的基础结构,但 Dagger 是为 JSR-330 互操作性而设计的,尽管您可能需要大量文件来绕过包私有构造函数/字段/方法,但您不必对类进行深入更改即可切换到手写组件或其他框架。

相关内容

最新更新