2015-10-20 188 views
1

我试图在用Dagger 2学习DI的同时创建一个Android库以及另一个项目。它证明比预期更困难。匕首依赖注入2

我的问题

我试图用所谓的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); 
} 

因此,这是用来注入MySingletonMyApplication类。它这样做。

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

这是伟大的和MySingleton我正在外地注射工作正常的情况下。

我曾尝试

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

我在这里做错了什么?

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

回答

1

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

你是绝对正确的。每个依赖关系图中单身人士是独一无二的。在创建第二个组件时,您基本上会创建第二个依赖关系图,该图对于该单例组具有不同的对象。

解决办法有两个:

  1. 在您的应用程序只创建一个图表,其中包括的lib模块
  2. 在你创建一个图形的lib,然后你的应用程序模块(S)添加到它(如在:https://github.com/google/dagger/tree/master/examples/android-activity-graphs(他们添加“每个活动”模块,但你会明白))
+0

我需要能够注入模块到我的库中的类。如果我有一个在我的库中创建的组件(可能是某种单例),然后传入我的应用程序组件中,然后使用它的这个实例呢? – StuStirling

+0

据我了解,你需要类似于: '@Component(dependencies = LibraryComponent.class,modules = MyAppModule.class)'为你的应用程序组件。这样你的应用程序组件将包含lib组件,并且能够使用它的对象(这基本上是选项2的含义)。 – Ognyan

+0

我要链接你自己的问题,我刚刚发现帮助我解决了这个问题。 http://stackoverflow.com/questions/31354735/how-to-migrate-missing-inject-from-module-with-complete-false-from-dagger-1-to这正是我需要的。 – StuStirling