当前位置: 首页 > 知识库问答 >
问题:

Dagger:如何根据构建实例化不同的ObjectGraph

成和悌
2023-03-14

我正在尝试使用匕首学习依赖注入。

我明白,在您的类中,您不会直接实例化客户机代码所依赖的对象,而是使用@inject声明它,通过模块创建ObjectGraphs,并从ObjectGraph中获取对象:

  @Inject CoffeeMaker coffeeMaker;

  public static void main(String[] args) {
    ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
    CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class);
    ....
  }

谢谢你。

共有1个答案

葛烨
2023-03-14

您可以在构建系统时进行,但您将遇到在构建规则中有选择地创建模块的情况,最终可能会意外地击败一些编译时约束。

您可以通过三种方式使用just dagger(不需要使用构建系统)来进行条件布线。

>

  • 为每组配置创建一个顶级模块,该模块包括提供某些实现的所有更具体的模块--一个用于测试,一个用于这种计费结构,一个用于那种。在生产Dex文件中包含所有运行时顶级模块,并在图配置时在它们之间进行选择。

      null

    我倾向于推荐#1,因为您正在非常狭隘地构建每个案例的布线,并且您没有为不在hte选定模块中的模块和类加载适配器。#2.1是我的第二选择,因为与#2不同,它的分配最少。其他方法确实会使运行时的事情变得相当繁重,并导致浪费的类加载和实例化/分配。

  •  类似资料:
    • 我有一个特点,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构,它们有不同的实现。对于抽象,我将这些结构称为A-Z: 有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法? 我不熟悉编译语言。我所做的大部分工作都是使用Python和TypeScript。

    • 我正在做一个Dagger研究项目,我是基于我在git中发现的一些其他项目来做这个项目的,我在一个课上遇到了一个问题。 该项目是关于读取和提交git存储库的,它在不使用MVP和Dagger的情况下开始工作,但我正在重构它以使用这些特性。 RepositoriesPPreseInterimpl类扩展了BasePresenter,后者又有一个BaseView类型的视图(iRespositoriesPop

    • 标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我所做的只是调用 getInstance 或注入?我正在研究辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject

    • 问题内容: 在模块内部,如果需要基于模块构造时已知的变量提供不同的接口实现,则可以将逻辑放入该接口类型的@Provides方法中。像这样: 但是,这些实现可以由Dagger创建。我宁愿说“嘿,基于XI希望您为我实例化此类” 我考虑了几种选择。 更改providers方法以采用所有可能的实现: 这允许Dagger实例化它们并满足它们的所有依赖关系,但是如果每个实现都相对较大或创建成本很高,则不是一个

    • 问题内容: 在Go中,如何在运行时根据对象的类型创建对象的实例?我想您还需要先获取对象的实际值吗? 我正在尝试执行惰性实例化以节省内存。 问题答案: 为了做到这一点,你需要。 您可以使用结构类型(而不是int)执行相同的操作。还是其他的,真的。只需确保了解map和slice类型时new和make之间的区别即可。

    • 问题内容: 在我的构建控制台顶部附近,我看到带有修订号的“上次构建修订:”。如何在我的构建脚本中访问最后构建的版本#?我正在使用Gradle,但我认为这并不重要。Jenkins是否在系统属性中提供最后构建的rev#?当然,从我的构建脚本进行访问必须很简单… 问题答案: 我不认为git插件会将上次构建的修订版导出为环境变量,但是可以使用简单的shell命令(例如: BUILD_URL始终指向构建的自