模块依赖于 Dagger 中的另一个模块

2023-11-26

我正在尝试使用Dagger在我正在构建的应用程序上进行依赖注入,当我有一个包的模块依赖于注入器提供的值(可能是由另一个模块提供)时,在构建正确的 DAG 时遇到了麻烦。

如果我有一个用于某些可配置变量的简单模块(例如,我可能想将其换成测试环境)

@Module(
    injects = DependentModule.class,
)
public class ConfigModule {

    @Provides @Named("ConfigOption") String provideConfigOption() {
        return "This Module's configurable option!";
    }
}

另一个模块依赖于它,例如

@Module(
    injects = {
            TopLevelClass.class
    }
)
public class DependentModule {

    @Inject @Named("ConfigOption") String configOption;

    public DependentModule() {
        ObjectGraph.create(this).inject(this);
        doSomethingWithConfig(configOption);
    }

    @Provides @Singleton UsefulValue provideUsefulValue() {
        // Whatever this module needs to do...
    }
}

我尝试在构造函数中引导注入的行失败,并且它抱怨我没有指定显式injects行在适当的模块中。

通过反复试验,我发现如果在@Module我添加一行include = ConfigModule.class,但这在语义上让我觉得是错误的,因为 a) 我将要创建的 DAG 现在将包含两个模块的值,而不仅仅是一个模块的值,b) 它首先破坏了 DI 链接的目的/灵活性一个特定的模块而不是简单地让 Dagger 注入适当的值。

我想我不应该创建一个对象图this只是注入其中吗?但后来我遇到了不链接特定模块的问题......

简而言之:

  • 将其他模块提供的值注入一个模块的“正确”方法是什么?这里我使用的是字段注入,但是我的构造函数注入实验也导致了很多失败。
  • 相关地,什么时候适合使用addsTo vs. includes?

谢谢 :)


您不需要在一个模块中显式地从另一个模块中执行任何注入(字段或构造函数)。只需使用addsTo and includes. includes允许将模块添加到另一个模块并使用它们提供的所有内容。例子:

@Module()
public class ModuleA {
    @Provides @Named("ValueA") String provideValueA() {
        return "This is ValueA";
    }
}

@Module(
    includes = ModuleA.class
)
public class ModuleB {
    // ValueA comes from ModuleA
    @Provides @Named("ValueB") String provideValueB(@Named("ValueA") String valueA) {
        return valueA + " and ValueB";
    }
}

addsTo与使用ObjectGraph.plus(Object... modules)。当图形已经创建并包含一些模块(例如在应用程序类中)时,您可以使用以下命令创建新图形(例如在 Activity 中)plus。例子:

@Module()
public class ApplicationModule {
    @Provides @Named("ValueA") String provideValueA() {
        return "This is ValueA";
    }
}

@Module(
    addsTo = ApplicationModule.class
)
public class ActivityModule {
    // ValueA comes from ApplicationModule
    @Provides @Named("ValueB") String provideValueB(@Named("ValueA") String valueA) {
        return valueA + " and ValueB";
    }
}

public class DemoApplication extends Application {
  private ObjectGraph graph;

  @Override public void onCreate() {
     super.onCreate();
     graph = ObjectGraph.create(getModules().toArray());
  }

  protected List<Object> getModules() {
      return Arrays.asList(
          new ApplicationModule()
      );
  }

  public void inject(Object object) {
      graph.inject(object);
  }

  public ObjectGraph getObjectGraph() {
      return graph;
  }
}

public class DemoActivity extends Activity {
    private ObjectGraph activityGraph;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create the activity graph by .plus-ing our modules onto the application graph.
        DemoApplication application = (DemoApplication) getApplication();
        activityGraph = application.getApplicationGraph().plus(new ActivityModule());

        // Inject ourselves so subclasses will have dependencies fulfilled when this method returns.
        activityGraph.inject(this);
    }

    @Override protected void onDestroy() {
        // Eagerly clear the reference to the activity graph to allow it to be garbage collected as
        // soon as possible.
        activityGraph = null;
        super.onDestroy();
    }
}

您还可以检查this创建图表范围的示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模块依赖于 Dagger 中的另一个模块 的相关文章

随机推荐

  • RewriteRule - 两个参数,但最后一个参数是可选的

    我无法重写以包含两个参数 但最后一个参数是可选的 例如 http www mywebsite com friends jamie 正斜杠也应该是可选的 这应该与此相同 http www mywebsite com friends php n
  • 隐藏奇怪的不需要的 Xcode 日志

    使用 Xcode 8 并创建新的空白项目时 运行应用程序时会出现以下日志 2016 06 13 16 33 34 406093 TestiOS10 8209 100611 bundleid com appc TestiOS10 enable
  • 在数据库中的任意位置查找值

    给定一个数字 我如何发现它可以在哪个表和列中找到 我不在乎它是否快 它只需要工作 这可能对你有帮助 来自纳拉亚纳 维亚斯 它搜索给定数据库中所有表的所有列 我以前用过它并且有效 这是上面链接中的存储过程 我所做的唯一更改是用临时表替换表变量
  • 有没有办法自动占据WrapPanel中的空白区域?

    WrapPanel 的子级按顺序填充 如所附屏幕截图所示 因此 Panel根据每个孩子的身长 制作了较长的空白 如何利用空白空间重新排列孩子们 到目前为止 似乎只有很少的人使用 WrapPanel 并且没有足够的示例 有一些自动的方法吗 或
  • EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数

    我收到有关提交和回滚的异常 但不确定我的存储过程到底出了什么问题 我已阅读其他此类问题的答案 但无法找到提交计数到底在哪里混乱 所以 这是我使用的存储过程 this is a procedure used for the purge uti
  • 如何配置 leiningen 以使用最新的 Clojure 版本来在项目之外启动 repl?

    当我为特定项目启动 clojure repl 时 对于 leiningen 来说足以在具体中指定正确的 clojure 版本项目 clj如上所述的文件here 但是当我在项目之外启动 repl 时 旧版本就会启动 就我而言 旧版本是1 5
  • Airflow安装成功,但无法运行

    C Python27 Scripts gt airflow initdb airflow 不被识别为内部或外部命令 可运行的程序或批处理文件 C Python27 Scripts gt 气流初始化 airflow 不被识别为内部或外部命令
  • 如何从 Hibernate MetadataSources 发现完全限定的表列

    我有一个实体 我有一个实体Class
  • C# 的线程是在用户级还是内核级创建的?

    最近在研究操作系统 遇到了这个问题 线程是在C 用户级还是内核级创建的 比如 Thread mythread new Thread ThreadStart something 据我所知 内核级CPU密集型线程的进程可以比用户级别的运行速度更
  • 如何在 Mono 上将 Linq 与 MySql 数据库结合使用?

    有许多库为与 MySql 数据库交互的 C 代码提供 Linq 功能 其中哪一个在 Mono 上最稳定 最可用 背景 大部分不相关 我有一个简单的 C Net 2 0 程序 用于更新 MySql 数据库中的值 它每晚通过 cron 作业执行
  • Facebook SDK FB.GetLoginStatus 加载被 X-Frame-Options 拒绝(仅限 Firefox)

    我有一个 Web 应用程序登录页面 在文档加载完成后 该页面会从 Facebook JavaScript SDK 调用 FB GetLoginStatus 这在所有浏览器 包括移动设备 上都运行得很好 从此以后就很幸福了 但是 有一天 我突
  • Akka 持久化查询事件流和 CQRS

    我正在尝试在我的 ES CQRS 架构中实现读取端 假设我有一个这样执着的演员 object UserWrite sealed trait UserEvent sealed trait State case object Uninitial
  • 在 cakePHP 2.x 中使用虚拟字段

    我已通读文档并努力了解该怎么做 另外 我已经阅读了 stackoverflow 上的问题 但我尝试的任何方法都没有帮助 我有一个下拉列表 我想列出公司中的所有员工 该列表应显示如下 Name Surname Job Title 在我的模型中
  • 使用 Python / lxml 和 XPath 检索属性名称和值

    我将 XPath 与 Python lxml Python 2 一起使用 我对数据进行了两次处理 一次用于选择感兴趣的记录 另一次用于从数据中提取值 这是代码类型的示例 from lxml import etree xml
  • UTF-8 到 Unicode 代码点

    是否有一个函数可以将 UTF 8 更改为 Unicode 将非特殊字符保留为普通字母和数字 即德语单词 tch 将被渲染为 tch 20AC 21AC 请注意 我正在编写 Unicode 代码 编辑 我正在尝试以下函数 但是尽管该函数适用于
  • 获取调用方法的对象

    如果我有一个来自随机班级的电话 如下所示 implementation SomeClass void classMethodFoo int a SomeSingleton sharedInstance aValue end Inside S
  • 可以向 Google Maps API 发出多少个请求而不被禁止?

    我正在通过 Google Maps API 使用地址自动建议 希望速度尽可能快 目前 我在脚本中添加了 10 毫秒的延迟 以避免因太多请求而被禁止 有这个必要吗 可以提出多少个请求而不被禁止 附 我希望为此添加一些合适的标签 但我真的想不出
  • 如何在 Hibernate 查询语言中执行左连接?

    这是我的 HQL 查询 但它不起作用并且抛出错误 Hql查询 SELECT FROM TABLEA A LEFT JOIN A TABLEB B WHERE A COLUMNNAME B COLUMNAME 它会导致此错误 org hibe
  • 到底什么是“objc_msgSend_fixup”?

    我正在摆弄 Objective C 运行时 尝试编译 Objective C 代码而不将其链接到libobjc 并且我的程序遇到了一些分段错误问题 因此我从中生成了一个汇编文件 我认为没有必要显示整个汇编文件 在我的某个时刻main函数 我
  • 模块依赖于 Dagger 中的另一个模块

    我正在尝试使用Dagger在我正在构建的应用程序上进行依赖注入 当我有一个包的模块依赖于注入器提供的值 可能是由另一个模块提供 时 在构建正确的 DAG 时遇到了麻烦 如果我有一个用于某些可配置变量的简单模块 例如 我可能想将其换成测试环境