如何声明依赖关系

2024-04-09

我正在研究 Dagger 2,所以我想了解一些基本的东西。我有以下代码:

@Module
public class MainModule {

@Provides
public Presenter provideMainActivityPresenter(Model model){
    return new MainPresenter(model);

}

@Provides
public Model provideMainModel(){
    return new MainModel();
 }
}

and my MainPresenter类看起来像这样:

public class MainPresenter implements Presenter {

@Nullable
private ViewImpl view;
private Model model;



public MainPresenter(Model model) {
    this.model = model;
}

@Override
public void setView(ViewImpl view) {
    this.view = view;
  }
 }

除了上面的代码之外,我可以执行以下操作吗?

public class MainPresenter implements Presenter {

@Nullable
private ViewImpl view;

@Inject
Model model;


@Override
public void setView(ViewImpl view) {
    this.view = view;
 }
}

因为MainPresenter取决于Model它不是@Nullable.
或者这是错误的?

我不明白何时应该将依赖项作为构造函数参数,或者何时应该使用@Inject


您基本上有 3 种使用 Dagger 的方法

  • 构造函数注入
  • 现场注入
  • 自己从模块中提供它

(还有方法注入,在创建对象后调用方法)


以下是使用提供您的类的模块。虽然没有错,但这是编写和维护的最大开销。您可以通过传入请求的依赖项来创建对象并返回它:

// in a module

@Provides
public Presenter provideMainActivityPresenter(Model model){
  // you request model and pass it to the constructor yourself
  return new MainPresenter(model);
}

这应该与需要额外设置的东西一起使用,例如Gson, OkHttp, or Retrofit这样您就可以在一个地方创建具有所需依赖项的对象。


以下内容将用于在您无权访问或不想使用构造函数的情况下注入对象。您注释该字段并在组件上注册一个方法来注入您的对象:

@Component class SomeComponent {
  void injectPresenter(MainPresenter presenter);
}

public class MainPresenter implements Presenter {

  // it's not annotated by @Inject, so it will be ignored
  @Nullable
  private ViewImpl view; 

  // will be field injected by calling Component.injectPresenter(presenter)
  @Inject
  Model model;

  // other methods, etc
}

这还将为您提供在演示者处注册所有类的开销,并且应该在您无法使用构造函数(例如活动、片段或服务)时使用。这就是为什么所有这些 Dagger 样本都有这些onCreate() { DaggerComponent.inject(this); }注入 Android 框架部分的方法。


最重要的是,您可以使用构造函数注入。您用注释构造函数@Inject并让 Dagger 了解如何创建它。

public class MainPresenter implements Presenter {

  // not assigned by constructor
  @Nullable
  private ViewImpl view;

  // assigned in the constructor which gets called by dagger and the dependency is passed in
  private Model model;

  // dagger will call the constructor and pass in the Model
  @Inject 
  public MainPresenter(Model model) {
    this.model = model;
  }
}

这只需要您注释您的类构造函数,并且 Dagger 将知道如何处理它,前提是可以提供所有依赖项(构造函数参数,本例中的模型)。


上面提到的所有方法都会创建一个对象,并且可以/应该在不同的情况下使用。

所有这些方法要么将依赖项传递给构造函数,要么注入@Inject直接注释字段。因此,依赖关系应该位于构造函数中或由@Inject这样 Dagger 就知道他们了。

我还写了一篇关于Dagger 2 的基本使用 http://blog.davidmedenjak.com/android/2016/05/04/dagger-2-introduction.html以及一些进一步的细节。

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

如何声明依赖关系 的相关文章

随机推荐

  • jQuery Mousemove:5px 变化时触发

    出于多种技术原因 我在 jQuery 上实现自己的 可拖动 功能 而不是使用 jQuery UI 并且我使用 mousedown 和 mousemove 事件来侦听尝试拖动元素的用户 到目前为止效果很好 我只是想每移动 5 像素 而不是逐像
  • 制作带有源子目录的文件

    我最新的项目是用 C 编写的 我使用的是 GNU Make 项目目录布局如下 project src subdir1 subdir2 containing tests doc bin 我希望能够致电make在顶级目录中 即项目目录中需要一个
  • 在 Java 中使用 lambda 表达式有运行时优势吗? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在阅读一些关于 Java 8 中提供的 lambda 表达式的博客和答案 我无法弄清楚单位 lambda 表达式是否有任何运行时优势 我
  • Jupyter笔记本,如何同时运行多个单元?

    我定义了一个运行 bash 脚本的 python 函数 假设该函数是 calc x y z 如果我在 python 中使用一些变量运行这个函数 gt gt gt calc 1 2 3 它生成一个 C 代码 使用变量来模拟某些东西 x 1 y
  • 使用 awk 读取串行输入,插入日期

    我正在尝试重新格式化串行输入 该输入由两个用逗号分隔的整数组成 从 Arduino 发送 1 2 3 4 0 0 0 1 我想在每行后面附加日期 用制表符分隔所有内容 到目前为止 这是我的代码 cat dev cu usbmodem3d11
  • 3d 表面的凸包算法 z = f(x, y)

    我有一个以一组三元组 x i y i z i 形式给出的 3D 表面 其中 x i 和 y i 大致位于网格上 并且每个 x i y i 都有一个关联的 z i 值 典型的网格是20x20 我需要在给定的公差范围内找到哪些点属于曲面的凸包
  • 如何通过流java8中的键获取所有不同的值

    我目前正在学习一些关于流的知识 我有以下 JSONArray 并且我希望能够检索所有不同的 xvalue datasets ds1 xvalues empty x1 x2 ds2 xvalues empty x1 x2 x3 我正在尝试以下
  • 如何正确构建我的 HTML 文件?

    对于一个基本的静态网站 有几个页面和子页面 我对 HTML 页面目录结构的最佳实践有点困惑 假设我有一个像这样的简单网站 索引 主页 页面 关于页面 联系页面和新闻页面 在新闻页面上 有两个链接指向新闻页面的两个子页面fizz html和b
  • 为什么Python函数有一个__dict__?

    在Python中 使用创建的函数def and lambda have a dict 属性 以便您可以动态地向它们添加属性 有一个 dict 每个函数都有内存成本 一个空的dictPython 2 6 中使用 140 个字节 向函数添加属性
  • 在 vb.net 中纠正图像方向服务器端

    在我正在开发的移动网络应用程序中 用户可以使用相机拍照 并将相机图像上传到服务器 我遇到的问题是 在 iOS 设备上 图像会获得与其关联的 EXIF 方向标签 例如 ROTATE 90 CW 该方向标签会导致图像在显示时以不正确的方向显示
  • Django与领域和自身的多对多关系独特

    我尝试使用语言和内容创建帖子 并将其与同一页面的其他版本相关联 但我陷入困境 class Page models Model content models TextField language models CharField max le
  • 如何在android中使用用户当前位置获取邮政编码

    我正在尝试获取邮政编码 但无法获取邮政编码 邮政编码 我可以获取当前城市 但是当我尝试获取邮政编码时 它给了我一个空指针异常 谁能帮我 final Geocoder gcd new Geocoder getApplicationContex
  • 字符的序数/int/ascii 值

    在 clojure repl 中我可以这样做 gt int a 97 在闭包脚本中 我不断得到 gt int a 0 在我当前的 clojurescript 项目中 我定义了一个 var def ord a int a 当我检查发出的 ja
  • C:将值扫描到数组中与常量的相等性进行比较的问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我对 C 完全陌生 现在我正在尝试掌握基础知识 但在从 scanf 读取数据和填充数组时遇到问题 根据我的观察 我认为问题出在 s
  • 有没有办法在android 2.1中不使用动画来旋转按钮

    我正在寻找旋转按钮的方法 不使用动画 我不想使用动画 因为this https stackoverflow com questions 8037185 onlclick listener is not working properly 如果
  • 如何向这个 elm 效果示例添加第二个骰子?

    我是 Elm 新手 一直在查看以下示例 请注意 这是在较新的 0 17 架构下 其中 Action 现在是 Command http elm lang org examples random http elm lang org exampl
  • mysql查询失败时是否有错误日志记录?

    我很好奇当我执行查询时 MySQL 数据库是否记录任何错误 我知道我打电话mysql 错误 http php net manual en function mysql error php检索错误 但数据库端是否还有其他日志记录 默认情况下
  • 用于数据库备份的Linux shell脚本

    我尝试了很多数据库备份脚本 但我无法成功 我想每小时备份一次数据库 我将文件添加到 etc cron hourly 文件夹 将其 chmod 更改为 755 但它没有运行 至少我写了我的伪代码 如果您能为该操作编写一个脚本并告诉我我还应该做
  • 为jade文件中的变量赋值

    是否可以在jade文件中分配变量 以使代码更具可读性 具体来说 我创建了这个jade文件 extends layout var format 1 0f block title title Your score table block bod
  • 如何声明依赖关系

    我正在研究 Dagger 2 所以我想了解一些基本的东西 我有以下代码 Module public class MainModule Provides public Presenter provideMainActivityPresente