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

Dagger 2 如何在不影响代码的情况下将我的DI框架从dagger更改为其他框架?,dagger-2,dagger,Dagger 2,Dagger,Dagger看起来是android的一个不错的框架。但它如何与实际项目脱钩呢 如果我在我的一个项目中使用它,而我不想再使用它,那么如何从我的项目中删除它而不影响我的代码呢?Dagger符合,这是一个用于依赖项注入表面的Java规范。这意味着,应用程序使用的大多数配置(至少在应用程序中的文件中)都是按照Java依赖项注入标准编码的,而不是Dagger本身 除非您使用,否则您可能只能在最顶层切换依赖项注入框架,在那里您定义并引用您的类。您还可以将Dagger组件与非Dagger DI via互连,并

Dagger看起来是android的一个不错的框架。但它如何与实际项目脱钩呢

如果我在我的一个项目中使用它,而我不想再使用它,那么如何从我的项目中删除它而不影响我的代码呢?

Dagger符合,这是一个用于依赖项注入表面的Java规范。这意味着,应用程序使用的大多数配置(至少在应用程序中的文件中)都是按照Java依赖项注入标准编码的,而不是Dagger本身

除非您使用,否则您可能只能在最顶层切换依赖项注入框架,在那里您定义并引用您的类。您还可以将Dagger组件与非Dagger DI via互连,并巧妙地使用模块,或者编写自己的组件和子组件实现,无论Dagger注释是否在其上。Dagger还将其注释和公共接口打包在一个文件夹中,因此您可以在不需要在同一天清除注释的情况下停止Dagger代码的生成

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

  • @Inject
    提供程序
    @限定符
    ,以及
    @Scope
    :。这些是您应该在使DI知晓的文件中看到的接口,以及您在应用程序中使用的自定义限定符和作用域。JSR-330中还定义了通用范围
    @Singleton
    和通用限定符
    @Named
  • :Dagger推荐的自动生成工厂接口和实现的解决方案,但不是Dagger的一部分。使用
    @Inject
    提供程序
    ,设计用于Spring、Guice和其他DI环境。相比之下,Guice的解决方案是使用,这是反射性的,并且是特定于Guice的
  • Lazy
    :提供程序的Dagger特定接口,可精确计算其值一次。您可以为任何T Dagger理解的程序注入
    Lazy
    Provider
    ,但与Provider接口本身不同,JSR-330中没有定义Lazy。匕首用它自己的
  • :匕首专用,但不经常明确使用
正确的匕首配置,与您的业务逻辑分离:

  • @模块
    @提供
    ,和
    @绑定
    :匕首特定,因为每个依赖项注入结构都使用自己的配置类型。Guice反射性地使用Java模块,Spring以其XML配置而闻名。请记住,编写良好的
    @提供了可以从任何代码(包括手写代码)调用的方法
  • @CanReleaseReferences
    和ReleaseReferenceManager:
  • @contributesandroid注射器
    、android注射器和分派android注射器:
  • @Component
    @Subcomponent
    :特定于Dagger的注释,但由于这些注释定义为接口,因此您可以随意实现它们,包括手动实现。您还可以创建一个没有Dagger或DI注释的接口,并让Dagger注释的接口扩展非Dagger注释的接口
最后,Dagger可以做一件鬼鬼祟祟的事情:Dagger将相邻包中的实现写入
@Inject
类和模块。因此,您可以(例如)通过Dagger创建对象,如果不编写调用对象包private
@Inject
构造函数的
public
工厂,就无法创建这些对象。如果您想撕掉Dagger并手工编写等价的构造函数,您可能会发现自己在许多带注释的方法和字段中添加了
public
,或者在这些包中编写了许多帮助器类,在这些包中它们可以访问封装的方法和字段


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

太长了。。。无论如何谢谢你,杰夫。