Dagger 2如何在任何地方访问相同的组件
Dagger 2如何在任何地方访问相同的组件
我如何创建一个单例对象,以便在代码的任何地方都可以访问它?
- 我想要注入我的单例组件的对象(1)不能在Dagger中创建。
- 这些对象没有共同的依赖项,我可以访问(例如
getApplication()
)。
举个例子:
InjectedClass:
public class InjectedClass { public InjectedClass() { System.out.println("创建注入的类"); } }
HolderClassA:
public class HolderClassA { // 这是我标记为(1)的对象之一 @Inject InjectedClass b; public HolderClassA() { Injector build = DaggerInjector.builder().build(); build.inject(this); System.out.println(b); } }
HolderClassB:
public class HolderClassB { // 这是我标记为(1)的另一个对象 @Inject InjectedClass b; public HolderClassB() { Injector build = DaggerInjector.builder().build(); build.inject(this); System.out.println(b); } }
Provider:
@Module public class Provider { @Provides @Singleton InjectedClass provideInjectedClass() { return new InjectedClass(); } }
Injector:
@Component(modules = {Provider.class}) @Singleton public interface Injector { void inject(HolderClassA a); void inject(HolderClassB a); }
代码的某个地方:
new HolderClassA();
代码的其他地方与前面的代码无关,也没有相同的父级或可以访问相同的对象(例如dagger指南中的getApplication()
):
new HolderClassB();
实际结果: 创建了两个InjectedClass的实例
期望结果: 创建一个单一的InjectedClass实例。
问题在于DaggerInjector.builder().build();
创建了不相互了解的不同范围。例如,我可以通过创建静态变量DaggerInjector.builder().build()
并从中调用注入来解决此问题。但这将不再是依赖注入,而是非平凡的单例模式。
问题的出现原因是无法在不同的依赖项或应用程序模块之间访问和共享相同的组件。Dagger不是Android包的一部分,因此无法实现这一点。解决方法是改变结构,并要求使用您的库的应用程序使用InjectedClass的实现或Application类来初始化它,类似Facebook SDK的做法。您可以尝试以下方法:
1. 创建一个顶级组件AppComponent,使用AppModule类进行初始化,并提供InjectedClass的单例实例。
(modules = arrayOf(AppModule::class))
interface AppComponent {
//子组件
fun plusHolderClass1(holderModule: HolderModule1): HolderComponent1
fun plusHolderClass2(holderModule: HolderModule2): HolderComponent2
//提供方法
fun getInjectedClass(): InjectedClass
}
2. 创建HolderComponent1和HolderComponent2,分别为HolderClass1和HolderClass2提供依赖注入。
(modules = arrayOf(HolderModule1::class))
interface HolderComponent1{
fun inject(holder: Holder1)
}
3. 在应用程序的Application类中存储AppComponent的实例。
class MyApplication : Application() {
lateinit var appComponent: AppComponent
override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.builder()
.appModule(AppModule())
.build()
}
}
4. 在需要进行依赖注入的地方使用以下代码进行注入。
val myApplication = application as MyApplication
myApplication.appComponent.plusHolderComponent1(HolderModule1()).inject(yourObject)
通过这种方式,可以在不同的依赖项或应用程序模块之间访问和共享相同的组件。InjectedClass对象将通过获取提供方法中的实例来注入到yourObject中。