Dagger 2 的依赖注入

Dependency Injection With Dagger 2

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

我的问题

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

当前设置

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

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

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

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

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

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

太棒了,我按字段注入的 MySingleton 实例工作正常。

我试过的

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

我做错了什么?

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

I believe this is because it is a new component that I'm creating...

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

有两种解决方案:

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