【问题标题】:Dependency Injection With Dagger 2Dagger 2 的依赖注入
【发布时间】:2015-10-20 17:19:05
【问题描述】:

我正在尝试与另一个项目一起创建一个 Android 库,同时使用 Dagger 2 学习 DI。事实证明这比预期的要困难。

我的问题

我正在尝试使用一个名为 MySingleton 的单例类,我想从我的 Android 库和主应用程序中访问它。

当前设置

基本上,我的 Android 库项目中有一个名为 MySingleton 的单例类。在项目中,我有一个名为 SingletonModule 的类,它是一个 Dagger2 模块,提供我的单例。

@Provides @Singleton
MySingleton providesMySingleton() {
    return new MySingleton();
}

好的,现在在我的实际应用中我有以下组件。

@Singleton
@Component(modules = {SingletonModule.class})
public interface ApplicationComponent {
    void inject( MyApplication application );
}

所以这是用于将MySingleton 注入MyApplication 类。它就是这样做的。

this.applicationComponent = DaggerApplicationComponent.builder()
            .singletonModule( new SingletonModule() ) // does it for you as empty constructor
            .build();
    applicationComponent.inject(this);

这很好,我通过字段注入的 MySingleton 实例运行良好。

我的尝试

在我的 Android 库项目中,我创建了一个名为 SingletonComponent 的新组件,它的功能与 ApplicationComponent 相同,只是提供了 MySingleton 对象。然后在扩展ServiceMyService 类中,我按字段注入了MySingleton 对象。这没有我想要的效果。它确实反对MySingleton 对象,但它与注入我的实际应用程序时创建的实例不同。我相信这是因为它是我正在创建的一个新组件...

我在这里做错了什么?

我查看了许多不同的网站并遵循了许多教程,但使用此依赖注入并没有点击。

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

    我相信这是因为它是我正在创建的一个新组件...

    你完全正确。单例对于每个依赖图都是唯一的。创建第二个组件时,您实际上是在创建第二个依赖关系图,该依赖关系图具有该单例的不同对象。

    有两种解决方案:

    1. 在您的应用中仅创建一个包含 lib 模块的图表
    2. 在您的库中创建一个图表,然后将您的应用程序模块添加到其中(例如:https://github.com/google/dagger/tree/master/examples/android-activity-graphs(他们正在那里添加“每个活动”模块,但您会明白的))

    【讨论】:

    • 我需要能够将模块注入到我的库中的类中。如果我有一个在我的库中创建的组件(可能是某种单例),然后我将它传递给我的应用程序组件,然后使用它的该实例怎么办?
    • 据我了解,您的应用程序组件需要类似:@Component(dependencies = LibraryComponent.class, modules = MyAppModule.class)。这样,您的应用程序组件将包含 lib 组件并能够使用其对象(这基本上是选项 2 的含义)。
    • 我将链接您自己的问题,我刚刚发现它可以帮助我解决它。 stackoverflow.com/questions/31354735/… 这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多