使用Dagger 2进行依赖注入

时间:2015-10-20 17:19:06

标签: android dependency-injection dagger-2

我试图在与Dagger 2学习DI的同时与另一个项目一起创建一个Android库。事实证明它比预期更难。

我的问题

我尝试使用名为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对象。然后在扩展MyService的{​​{1}}类中,我按字段注入了Service个对象。这没有我所追求的效果。它确实对象是MySingleton对象,但它与注入我的实际应用程序时创建的实例不同。我相信这是因为它是我创造的新组件......

我在这里做错了什么?

我查看了很多不同的网站,并且遵循了许多教程,但是这些依赖注入并没有点击。

1 个答案:

答案 0 :(得分:1)

  

我相信这是因为它是我正在制作的新组件......

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

有两种解决方案:

  1. 在您的应用中只创建一个包含lib模块的图表
  2. 在你的lib中创建一个图形,然后将你的应用程序模块添加到它(如:https://github.com/google/dagger/tree/master/examples/android-activity-graphs(他们在那里添加“每个活动”模块,但你会得到这个想法))