Dagger 2 组件中的 getter 方法的用途是什么?

2024-01-22

我正在尝试了解 Dagger 2 中的组件。这是一个示例:

@Component(modules = { MyModule.class })
public interface MyComponent {

    void inject(InjectionSite injectionSite);

    Foo foo();

    Bar bar();   

}

我明白什么是void inject()方法可以。但我不明白另一个是什么Foo foo()getter 方法可以。这些其他方法的目的是什么?


在依赖组件中的使用

在依赖组件的层次结构的上下文中,例如这个例子 https://github.com/codepath/dagger2-example, 提供方法例如Foo foo()用于公开对依赖组件的绑定。 “Expose”的意思是“提供”甚至“发布”。请注意,方法本身的名称实际上是不相关的。一些程序员选择命名这些方法Foo exposeFoo()使方法名称反映其目的。

解释:

当您在 Dagger 2 中编写组件时,您将包含以下内容的模块组合在一起@Provides方法。这些@Provides方法可以被认为是“绑定”,因为它们将抽象(例如类型)与解析该类型的具体方法相关联。考虑到这一点,Foo foo()方法使组件能够公开其绑定Foo到依赖组件。

Example:

比方说Foo是一个应用程序单例,我们希望将其用作实例的依赖项DependsOnFoo但在范围较窄的组件内。如果我们写一个天真的@Provides的模块之一内的方法MyDependentComponent然后我们会得到一个新的实例。相反,我们可以这样写:

@PerFragment
@Component(dependencies = {MyComponent.class }
           modules = { MyDependentModule.class })
public class MyDependentComponent {

    void inject(MyFragment frag);

}

和模块:

@Module
public class MyDepedentModule {

    @Provides
    @PerFragment
    DependsOnFoo dependsOnFoo(Foo foo) {
        return new DependsOnFoo(foo);
    }
}

还假设注射部位为DependentComponent包含DependsOnFoo:

public class MyFragment extends Fragment {
    
    @Inject DependsOnFoo dependsOnFoo

}

注意MyDependentComponent只知道模块MyDependentModule。通过该模块,它知道它可以提供DependsOnFoo使用一个实例Foo,但它不知道如何提供Foo通过它自己。有时候是这样的despite MyDependentComponent是一个依赖的组成部分MyComponent. The Foo foo()中的方法MyComponent允许依赖组件MyDependentComponent to use MyComponent的绑定为Foo注射DependsOnFoo。没有这个Foo foo()方法,编译会失败。

用于解析绑定

假设我们想获得以下实例Foo无需打电话inject(this). The Foo foo()组件内的方法将允许以与您可以调用的方式大致相同的方式getInstance()与吉斯的Injector https://google.github.io/guice/api-docs/latest/javadoc/index.html或温莎城堡Resolve https://github.com/castleproject/Windsor/blob/master/docs/three-calls-pattern.md。图示如下:

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

Dagger 2 组件中的 getter 方法的用途是什么? 的相关文章

随机推荐

  • Windows 上的 GVIM:禁用 tmp 文件创建的方法

    我在 Windows 上使用 gvim 我想知道一种禁用临时文件 以 结尾 文件创建的方法 还有如果我们这样做的话会有问题吗 您可以通过将此行放入 vimrc 中来禁用备份文件 set nobackup 我几乎总是这样做 因为 文件更烦人而
  • 如何使用 python mysqldb 一次插入多行

    我有一个列表列表 例如 a b c d 我有一张桌子叫T和两个字段F1 F2 字段列表中的第一项映射到F1 其次是F2 如何在单个命令或调用中为每个内部列表插入行 而不是使用这样的 for 循环 for i in a b c d c exe
  • jqgrid 在网格加载后将单元格输入更改为只读

    加载所有网格数据后 如何将单元格输入更改为 只读 我只希望加载的行将此单元格设置为只读 当我添加新行时 我不希望此单元格设置为只读 提前致谢 UPDATE 这是我的代码 Grid1 jqGrid editurl clientArray da
  • Python 错误:未指定主机

    我刚刚写了一个简单的python demo 同时遇到了一个令人困惑的问题 import requests print requests get http www sina com cn 我知道正确的结果是返回 Response 200 但是
  • PHP的use语句在加载类时会导致额外的工作吗?

    代码示例1 use Outline Drawing var new Drawing 代码示例2 var new Outline Drawing 问题 如果我使用示例 1 中的代码 PHP 是否会使硬件工作更加困难 查找更多文件或执行更多处理
  • 在 Flask 中同时渲染多个模板

    我正在制作一个 Flask 应用程序 我有一个登录区域 一个博客区域 如果我想获取用户的登录信息 我将渲染登录模板 但这不会呈现必须显示在登录区域下方的博客模板 我会尽力让它更清楚 block login endblock blah bla
  • SSIS 脚本组件删除 CHAR(和)字段中的“\0”字符

    我目前正在开发一个字段中有 0 字符的数据库 例如领域 Category CHAR 4 有时值为 0 0 0 0 4 个零字符 有时为 4 个空白字符 我想使用脚本组件来区分存在此问题的所有字段 我编写了以下脚本 但它不起作用 因为 C 将
  • 设置 AnchoredOffsetbox 的线宽和面颜色?

    是否可以更改 AnchoredOffsetbox 的线宽 面颜色等 我用它来列出我的图旁边的一些变量 例如 A 1 B 2 以这种方式 垂直对齐 所以它有点像一个额外的图例 但句柄也是文本 但我不知道如何像图例那样设置框架的属性 非常感谢任
  • 动态更改 Quill 占位符

    我知道在实例化 Quill 编辑器时 有一个占位符选项 有没有一种方法可以在实例化编辑器后动态更改此占位符 占位符是通过 CSS 规则实现的 ql editor before content attr data placeholder 所以
  • 如何在别名列上使用聚合函数 SUM?

    Invoice ID PO Number and dueDate are shown in duplicates TotalPrice 是一个别名 应该是单价 总价是一个错误 所以假设是单价而不是总价 TotalShippingPrice
  • JSON.net 与 XPATH:如何保留 SelectToken 中的节点顺序?

    XPath 2 规定应按照文档中的顺序返回选择的节点顺序 当您在 JSON Net 中 SelectTokens JSONPath 时 情况似乎并非如此 当我处理以下文档时 string json Files dir1 Files file
  • 文件版本信息和程序集信息

    给出 Blah dll 的 AssemblyInfo cs 中的这段代码 assembly AssemblyVersion 3 3 3 3 assembly AssemblyFileVersion 2 2 2 2 然后在一个单独的 exe中
  • 如何将字符串转换为HashMap? [复制]

    这个问题在这里已经有答案了 我有一个 Java 属性文件 并且有一个KEY as ORDER 所以我检索VALUE那个KEY使用getProperty 加载属性文件后的方法如下 String s prop getProperty ORDER
  • Java 8 Javascript 引擎向后兼容性

    我正在我的项目中尝试 Java 8 但遇到了与构建过程相关的错误 我正在使用 ANT 脚本 有时我会使用一些 javascript 嵌入到 ANT 中 来执行一些构建特定的操作 导致错误的脚本部分如下所示 该项目使用 Java 7 或 Ja
  • Cygwin 上的 C 编译器生成什么?

    根据下面的 recognize compilers sh 脚本的输出 Cygwin 上似乎可以使用以下 C 编译器 那些标记为 Cygwin 的要求 cygwin1 dll 文件可用 pc 和 w64 编译器有什么区别 为什么没有 x86
  • C++20 std::ranges:范围适配器跳过每个第 n 个元素

    我正在尝试更熟悉 C 20std ranges我遇到了一个看似简单的问题 如果不滚动我自己的实现 我无法找到标准解决方案 问题很简单 我只想访问和处理使用 C 20 范围适配器的范围中的每个第 N 个元素 例如 我正在寻找一个实用程序 其中
  • 从一个文件访问另一个文件中的类实例?

    我有两个文件 都在同一个项目中 网络抓取框架的一部分 File1 处理 File2 生成的项目 在 File2 中 我有一个函数可以打印出有关进程的一些基本统计信息 已生成的项目数等 我在 File1 中有计数 我想使用 File1 中的统
  • Qt 库中的 GUI 线程检测

    我需要知道我的函数在哪个线程的上下文中运行 是主 GUI 线程还是某个工作线程 我无法使用简单的解决方案将 QThread 指针存储在主函数中并将其与 QThread currentThread 进行比较 因为我正在编写一个库并且无权访问主
  • php通过字符串名称调用类函数

    如何通过名称调用普通 非静态 类函数 下面给出了一个错误 指出 param 1 需要是一个有效的回调 我不希望该函数是静态的 我希望它是一个普通的函数 并且到目前为止我看到的所有示例都将它们设为静态 class Player public
  • Dagger 2 组件中的 getter 方法的用途是什么?

    我正在尝试了解 Dagger 2 中的组件 这是一个示例 Component modules MyModule class public interface MyComponent void inject InjectionSite inj