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
对象。然后在扩展 Service
的 MyService
class 中,我按字段注入了 MySingleton
对象。这没有达到我想要的效果。它确实反对 MySingleton
对象,但它与注入我的实际应用程序时创建的实例不同。我相信这是因为它是我正在创建的新组件...
我做错了什么?
我查看了许多不同的站点并遵循了很多教程,但是使用此依赖项注入并没有点击。
I believe this is because it is a new component that I'm creating...
你完全正确。每个依赖图的单例都是唯一的。创建第二个组件时,您实际上是在创建第二个依赖关系图,它具有针对该单例的不同对象。
有两种解决方案:
- 在您的应用中只创建一个包含库模块的图表
- 在你的库中创建一个图表,然后将你的应用程序模块添加到其中(如:https://github.com/google/dagger/tree/master/examples/android-activity-graphs(他们在那里添加 "per activity" 模块,但你会明白的) )
我正在尝试创建一个 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
对象。然后在扩展 Service
的 MyService
class 中,我按字段注入了 MySingleton
对象。这没有达到我想要的效果。它确实反对 MySingleton
对象,但它与注入我的实际应用程序时创建的实例不同。我相信这是因为它是我正在创建的新组件...
我做错了什么?
我查看了许多不同的站点并遵循了很多教程,但是使用此依赖项注入并没有点击。
I believe this is because it is a new component that I'm creating...
你完全正确。每个依赖图的单例都是唯一的。创建第二个组件时,您实际上是在创建第二个依赖关系图,它具有针对该单例的不同对象。
有两种解决方案:
- 在您的应用中只创建一个包含库模块的图表
- 在你的库中创建一个图表,然后将你的应用程序模块添加到其中(如:https://github.com/google/dagger/tree/master/examples/android-activity-graphs(他们在那里添加 "per activity" 模块,但你会明白的) )