Dagger看起来像是一个很好的Android框架。但它如何与实际项目脱钩?
如果我在我的某个项目中使用它并且我不想再使用它,如何从我的项目中删除它而不影响我的代码?
答案 0 :(得分:1)
Dagger符合JSR-330 injection standard,这是依赖注入表面的Java规范。这意味着您为应用程序使用的大多数配置(至少遍布应用程序中的文件)都编码为Java依赖注入标准,而不是Dagger本身。
除非您使用Lazy<T>
injections,否则您可能只能在最高级别切换您的依赖注入框架,您可以在其中定义@Component
并引用您的@Module
类。您还可以通过component dependencies将Dagger组件与非Dagger DI互连,并巧妙地使用模块,或者编写您自己的组件和子组件实现,无论Dagger注释是否在其上。 Dagger还将其注释和公共接口打包在separate package from the annotation processor中,这样您就可以在不需要在同一天擦除注释的情况下转移Dagger代码生成。
您在常见文件中找到的内容:
@Inject
,Provider<T>
,@Qualifier
和@Scope
:JSR-330 standard。这些是您应该在可识别DI的文件中看到的接口,以及您在应用程序中使用的自定义限定符和范围。公共范围@Singleton
和公共限定符@Named
也在JSR-330中定义。@AutoFactory
:Dagger建议的解决方案,用于自动生成Factory接口和实现,但不是Dagger的一部分。使用@Inject
和Provider<T>
,设计用于Spring,Guice和其他DI环境。相比之下,Guice的解决方案是使用FactoryModuleBuilder
,这是反射性和Guice特定的。Lazy<T>
:提供商的Dagger特定接口,只计算一次其值。您可以为任何T Dagger理解注入Lazy<T>
或Provider<T>
,但与Provider接口本身不同,Lazy未在JSR-330中定义。 Dagger使用自己的。MembersInjector<T>
:特定于Dagger,但不经常使用。适当的Dagger配置,与业务逻辑分开:
@Module
,@Provides
和@Binds
:特定于Dagger,因为每个依赖项注入结构都使用自己的配置类型。 Guice反射性地使用Java模块,而Spring以其XML配置而闻名。请记住,可以从任何代码中调用编写良好的@Provides
方法,包括您的手写代码。@CanReleaseReferences
和ReleasableReferenceManager:Dagger-specific extensions. @ContributesAndroidInjector
,AndroidInjector和DispatchingAndroidInjector:Dagger-specific extensions. @Component
和@Subcomponent
:特定于Dagger的注释,但由于这些注释被定义为 interfaces ,因此您可以实施它们。 #39; d喜欢,包括手动。您也可以创建一个没有任何Dagger或DI注释的接口,并让您的Dagger注释接口扩展您的非Dagger注释注释。最后,Dagger可以做的一件偷偷摸摸的事情:Dagger将相邻包中的实现写入@Inject
类和模块。因此,您可以(例如)通过Dagger创建对象,而无需编写调用对象的包私有public
构造函数的@Inject
工厂,而无法创建对象。如果你想撕掉Dagger并手工编写你的等效构造函数,你可能会发现自己将public
添加到很多@Inject
- 带注释的方法和字段,或者在这些包中编写了很多帮助类他们可以在哪里访问封装的方法和字段。
简而言之,尽管您可能在顶层和某些软件包中具有Dagger特定的基础架构,但Dagger专为JSR-330互操作性而设计 - 尽管您可能需要大量文件来绕过软件包私有构造函数/ fields / methods - 您不必对类进行深度更改以切换到手写组件或其他框架。