Dagger组件依赖含义

2024-04-16

我正在尝试 Dagger 2,我只是通过测试来了解这个框架。

我有一个 ApplicationComponent 需要成为整个应用程序的单例,所以我将其定义如下:

@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {
    Context provideContext();
}

带模块:

@Module
public class ApplicationModule {

    private Application appContext;

    public ApplicationModule(Application appContext) {
        this.appContext = appContext;
    }

    @Provides
    @Singleton
    public Context provideContext() {
        return appContext;
    }
}

现在我还想要一个 NetworkComponent,只要应用程序存在,它就需要处于活动状态。 该网络组件需要依赖于 ApplicationComponent。 所以我的网络组件如下:

@Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class})
@PerApp
public interface NetworkComponent extends ApplicationComponent {
    @Named(DaggerConstants.DEFAULT_RETROFIT)
    Retrofit provideDefault();

    @Named(DaggerConstants.OTHER_RETROFIT)
    Retrofit provideOther();

    void inject(MainActivity activity);
}

Module:

@Module
public class NetworkModule {

    @Named(DaggerConstants.DEFAULT_RETROFIT)
    @PerApp
    @Provides
    Retrofit provideDefaultRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.someurl.com/")
                .build();

        return retrofit;
    }

    @Named(DaggerConstants.OTHER_RETROFIT)
    @PerApp
    @Provides
    Retrofit provideOtherRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.someotherurl.com/")
                .build();

        return retrofit;
    }

    @PerApp
    @Provides
    SharedPreferences networkPreferences(Context context) {
        return context.getSharedPreferences("network", Context.MODE_PRIVATE);
    }
}

我有一些疑问:

1)我将这两个组件存储在Android的应用程序中。 但对我来说,我存储 AppComponent 和 NetworkComponent 似乎很奇怪。 我的 ApplicationComponent 提供 NetworkComponent 不是更好吗?

2)注释@PerApp之类的东西是否意味着什么,或者Dagger只是在寻找一个具有@PerApp注释的实时对象,如果没有,那么它会删除它?我不清楚。

3)用@Singleton等标记模块是否有用,因为这是可能的,但我在任何示例中都没有看到这一点。


我将这两个组件存储在 Android 的应用程序中。但对我来说,我存储 AppComponent 和 NetworkComponent 似乎很奇怪。我的 ApplicationComponent 提供 NetworkComponent 不是更好吗?

您缺少组件的概念。组件背后的想法是拥有生命周期彼此不同的对象。 例如:

  • Object A应该是应用程序单例。每当你需要这个对象时,它都会是完全相同的对象
  • Object B应该是活动单例。每次您的活动销毁并创建一个新对象时,都会创建一个新对象。
  • Object C应该是片段单例。每次将片段附加到活动或从活动中分离时,都会创建一个新对象。

    所以你指定你想要的ComponentC具有依赖性ComponentB,它依赖于ComponentA(假设它们每个都提供适当的命名依赖项。)

注释@PerApp它是否意味着什么,或者 Dagger 只是在寻找一个带有 @PerApp 注释的实时对象,如果没有,那么它会删除它?我不清楚。

自定义范围对于您负责的生命周期的对象很有用。也就是说,如果您已经声明了具有自定义范围的组件,则您有责任清除该组件,此后下次从组件请求该依赖项时,将为您创建一个新对象。

在上面的例子中,你必须注意清零ComponentB一旦您的活动被销毁,否则它将为您提供相同的B下次你提出要求时反对。

用 @Singleton 等标记模块是否有用,因为这是可能的,但我在任何示例中都没有看到这一点。

提供依赖关系不会有任何区别。但也许它会帮助您记住托管组件的范围。

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

Dagger组件依赖含义 的相关文章

随机推荐

  • 保存从 MS Access 2007 到 MS SQL Server 的 ODBC 连接的密码

    我负责将旧的 Access 2007 项目迁移到 MS SQL Server 2008 Express 第一阶段是将所有数据从 MS Access 数据库移动到 SQL Server 同时将 Access 表单和报告保留在客户端 因此 现在
  • 从中心生长[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我一直在尝试让底部的圆圈在 Firefox 中增长 需要添加其他前缀 仍在开发中 他们表现得很好 但我的目标是让他们从中
  • Spring MVC形式:选择选定的值?

    有没有办法通过 Spring MVC 在下拉列表中选择当前值
  • Django 表单字段中的 JavaScript 函数调用

    我想创建一个带有复选框的表单 单击时 它们会打开单独的文本区域 供用户输入更多信息 如果我想使用 Django 动态创建的表单字段 有没有一种方法可以为每个复选框添加一个函数调用 您可以使用 JavaScript 动态添加事件处理程序 您可
  • C# - WPF - 不使用 System.Windows.Forms 获取文件夹浏览器对话框?

    我有这个WPFapp 我想有从用户那里获取目录路径的功能 我想使用一些文件夹浏览器对话框 但我don t想要实施它System Windows Forms或者在里面使用一些巨大的脚本 WPF 中是否有一些已经实现的获取对话框的路径 我在这里
  • 使用命令行工具构建时如何添加 .jar 文件依赖项?

    非常简单的问题 不使用Ants或Maven可以完成吗 我特指的是命令行工具 请注意 我不想创建 uberjar 我只是希望存档单元 知道 其外部依赖项在哪里 假设您正在谈论命令行调用javac 您所说的是 我可以提供库作为 javac 的参
  • Qt QFileDialog - 仅具有静态函数的本机对话框?

    我试图简单地保存一个文件 但是 我需要输入一个不带后缀的文件名来自动获取默认后缀 setDefaultSuffix 会这样做 我不想为此完全失去本机保存对话框 exec 没有从 QDialog 重载 因此它完全绕过本机钩子 忽略 DontU
  • 从 vueJS 方法调用 setTimeout() 不起作用

    我试图允许用户从应用程序重置或关闭给定服务器 我现在正在开发界面 并希望向用户提供有关正在发生的事情的消息 我显示数据对象中定义的消息来指示所采取的操作 我使用 setTimeout 来切换重置 消息和重置消息 请参阅以下方法 system
  • 命令键的 jQuery 键代码

    我读过了jQuery 事件按键 按下了哪个键 https stackoverflow com questions 302122 jquery event keypress which key was pressed and 如何使用 jqu
  • python3.8中的最终注释和装饰器

    由于 Python 3 8 即将发布 我只是想知道两者之间的区别最终装饰器和最终注释 在 Python 3 8 中 Python 类型提示功能 体现为typing module https docs python org 3 library
  • Vim:如何滚动绑定光标线?

    Vim 的分割窗口视图中的两个窗口可以相互绑定滚动通过设置 set scrollbind对于他们俩来说 完成此操作后 如果我在一个窗口中向下滚动光标 其他窗口也会随之向下滚动 但是 两个窗口中的光标并未相互绑定 我用过 set cursor
  • DdlGenerator 构造函数不需要参数?

    我想对我的数据库操作进行单元测试 我发现这段代码 https gist github com nboire 2819920 但是 我收到以下错误 CityGame test info Compiling 2 Java sources to
  • 当设备令牌过期时,是否会自动从 FCM 设备组中删除? [复制]

    这个问题在这里已经有答案了 我对 Firebase Cloud Messaging 还很陌生 而且我还没有能够得到这个问题的满意答案 另外 抱歉 所有的全部停止 不幸的是我在 2017 年买了一台 MacBook 苹果决定用它的键盘进行实验
  • 如何将 dict 转换为 unicode JSON 字符串?

    使用标准库对我来说似乎不可能json模块 使用时json dumps它会自动转义所有非 ASCII 字符 然后将字符串编码为 ASCII 我可以指定它不转义非 ASCII 字符 但是当它尝试将输出转换为 ASCII 时它会崩溃 问题是 我不
  • 基于其他阵列形状的零填充阵列

    我有 K 个特征向量 它们都共享维度 n 但具有可变维度 m n x m 他们都生活在一个列表中 to be padded to be padded append np reshape np arange 9 3 3 array 0 1 2
  • 获取带有 mysqli 结果的行数组

    我需要从结果对象中获取所有行 我正在尝试构建一个包含所有行的新数组 这是我的代码 sql new mysqli config host config user config pass config db name if mysqli con
  • 在哪里可以下载 Windows Phone 开发人员工具?

    我找到了 Web 下载程序 但它们似乎对我不起作用 我如何下载 ISO 格式的最新版本或完整安装程序 我无法使用网络下载器 谢谢 尝试这个 http go microsoft com fwlink LinkId 201927 http go
  • 在 Typescript 对象中添加新属性

    我正在尝试在对象中添加新属性 但打字稿给出错误 错误 TS2339 类型 对象 上不存在属性 数量 product Object qty Number foo this product qty 1 Object是错误的注释 更改您的注释 p
  • 如何更改客户 ID 和订单 ID?

    当前 CustomerID 从 1 开始 而生成的第一个订单已OrderID 100000001 有什么方法可以改变这些字段 所以创建的第一个客户已经 顾客号码900000001并且创建的第一个订单有OrderID 900000001 通过
  • Dagger组件依赖含义

    我正在尝试 Dagger 2 我只是通过测试来了解这个框架 我有一个 ApplicationComponent 需要成为整个应用程序的单例 所以我将其定义如下 Component modules ApplicationModule clas